Yumico’s blog

iOS開発ブログ

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に書き換えて使用してください。