swift: テキストの高さを取得する簡単な方法(UITextView,UILabel)
なんだかんだでよく使う、表示されるテキストの高さを取得する方法。
開発環境:Xcode8 + swift3
UILabel
func labelHeight(label: UILabel) -> CGFloat{ label.sizeToFit() return label.frame.height }
UITextView
func textViewHeight(textView: UITextView) -> CGFloat { return textView.contentSize.height }
ただ、上記の方法だとUIから直接取得しているのでAutoLayoutのタイミングとか、Viewを読み込む処理スピードの低下とか色々都合が悪い時がある。 その場合は、NSStringクラスを使用して高さを取得しよう!
func labelHeight(label: UILabel, s: String) -> CGFloat { let str: NSString = NSString(string: s) let size : CGSize = CGSize(width: label.frame.width, height: CGFloat.greatestFiniteMagnitude) let att: [String: Any] = [NSFontAttributeName: label.font] let rect: CGRect = str.boundingRect(with: size, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: att, context: nil) return rect.height }
高さを取得しているのはNSStringクラスのstr.boundingRect(with: CGSize, options: NSStringDrawingOptions, attributes: [String : Any]?, context: NSStringDrawingContext?)
メソッド。
設定する引数は下記の通り。
引数 | 説明 |
---|---|
CGSize | 表示するUIのサイズ。高さを取得したい場合は幅を表示サイズに、高さをCGFloat.greatestFiniteMagnitude に設定。 幅を取得したい場合はその逆。 |
NSStringDrawingOptions | テキストの表示方法。 2007-06-19 - at_yasuの日記もといメモ書きにわかりやすく記載してある。 |
[String : Any]? | Attributesを設定。特にAttributedStringとかを使用していない場合は、[NSFontAttributeName: label.font] で良いです。 |
UITextViewの場合はUILabelをUITextViewに書き換えて使用してください。