Swift 文字列の表示域のサイズを取得する
やること
文字列を表示する場合に横幅がどれくらいになるか、高さがどれくらいになるか、を取得します。
縦幅が取得できればtwitterのタイムラインのように可変のUITableViewを作れたりします。
類似のエントリーはたくさんあったのですが、微妙に古くてそのままでは使えないものが多かったので、
それらを参考にさせてもらいながら書き直しという感じです。
類似のエントリー
ソースコード
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
文字が表示域の制約からはみ出てしまう場合どのように処理するかです。