人生の恥は書き捨て

プログラムとかいろいろ

Swift 文字列の表示域のサイズを取得する

やること

文字列を表示する場合に横幅がどれくらいになるか、高さがどれくらいになるか、を取得します。

縦幅が取得できればtwitterのタイムラインのように可変のUITableViewを作れたりします。

類似のエントリーはたくさんあったのですが、微妙に古くてそのままでは使えないものが多かったので、

それらを参考にさせてもらいながら書き直しという感じです。


類似のエントリー

  • qiita.com
  • www.toyship.org

ソースコード

let text = "表示域を計測したい文字列"
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping
let attributeDict = [
    NSFontAttributeName: UIFont.systemFontOfSize(16.0),
    NSParagraphStyleAttributeName: paragraphStyle
]
let constraintsSize = CGSizeMake(100, 100)
let textSize = NSString(string: text).boundingRectWithSize(constraintsSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributeDict, context: nil)

これのtextSizeがテキストが実際に表示される範囲のサイズです。

解説(メモ)

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping

文章の改行モードを指定します。今回は単語区切りで改行するように。
NSLineBreakMode.ByWordWrappingは他の記事だとNSLineBreakByWordWrappingとかになっているかもしれないですが、多分古いです。

let attributeDict = [
    NSFontAttributeName: UIFont.systemFontOfSize(16.0),
    NSParagraphStyleAttributeName: paragraphStyle
]

NSAttributedStringのAttributeを指定。文字サイズは16。

let constraintsSize = CGSizeMake(100, 100)

表示域の制約です。width=100でNSLineBreakMode.ByWordWrappingなので100に行く前に単語で改行します。

NSStringDrawingOptions.UsesLineFragmentOrigin

文字が表示域の制約からはみ出てしまう場合どのように処理するかです。