iOS9 UILabel Lines指定しても1行かLinesで指定した行数しか表示されない

投稿者: Anonymous

AutoLayoutを利用して高さを可変にしているCell上のLabelでLinesを4行に指定しています。
しかし、テキストの量が4行か4行以上の場合は4行表示されますがそれ以下の場合はたとえテキストが2行分あっても1行のみ表示され末尾が…になってしまいます。
この問題はiOS9でのみ発生し、iOS8ではテキストに応じて1〜4行がちゃんと表示されています。
コードは下記の通りです。

self.label.attributedText = attributedText;
[self.label sizeToFit];
[self.contentView layoutIfNeeded];

attributedTextに問題があるのかと思いself.label.text = textに試しに変更してみましたが問題は解決しなかったのでattributedTextに問題はなさそうです。

その他の設定としてはLabelの高さをテキストに応じて可変にするためLabelの上下左右にはその他の要素との距離を固定値で指定しています。
また、テキストが2行や3行分の時はその分の高さが確保されているようで上下の余白が大きくなっています。ちゃんと表示領域は確保されているのに1行しか表示されていないようです。
解決方法わかる方いましたら教えていただけると助かります。

解決

AttributedStringを表示できる大きさ(CGRect)を、計算で導いて、それによって、UILabelのフレームサイズを決定するのが、確実だと思います。
NSAttributedString UIKit Additions Referencefunc boundingRectWithSize(_ size: CGSize, options options: NSStringDrawingOptions, context context: NSStringDrawingContext?) -> CGRectを使って、計算ができます。
サンプルコードを示します(Swiftにて、失礼)。

import UIKit

// もとになるAttributedStringを用意。
let attributedText = NSAttributedString(string: "Alphabet Brake Canada Drive Energy Fight Global Human Italy Joint Knock", attributes: [NSFontAttributeName: UIFont(name: "Helvetica-Bold", size: 24.0)!])
// 幅200pxの場合の、矩形座標を算出。CGSizeのheightを、十分に大きな値にするのがポイント。
let textRect = attributedText.boundingRectWithSize(CGSize(width: 200.0, height: 2000.0), options: NSStringDrawingOptions.UsesLineFragmentOrigin, context: nil)
// textRect = {x 0 y 0 w 192.035 h 138}

// 計算の結果に基づいて、UILabelの高さを決める。
let label = UILabel(frame: CGRect(x: 0.0, y: 0.0, width: 200.0, height: textRect.size.height))
label.numberOfLines = 0
// 視覚的に分かりやすいように、UILabelに枠線をつけておく。
label.layer.borderWidth = 1.0
label.attributedText = attributedText

画像の説明をここに入力

コード中のコメントにも書きましたが、メソッドboundingRectWithSizeの第一引数CGSizeheightを、余裕があるくらい大きな値にしないと、期待する値を得られないようです。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *