web-dev-qa-db-ja.com

UILabelの高さをテキストに合わせる

高さをテキストに合わせて調整したいラベルがいくつかあります。これは私が今このために書いたコードです。

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

編集:

この問題はこのコードには含まれていなかったので、私の修正は問題自体にあります。それはまだ他の人に役立つかもしれません!

95
TheBurgerShot

私はこれを遊び場に置いたばかりなので、うまくいきます。

Swift 4.0用に更新されました

import UIKit

 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

let font = UIFont(name: "Helvetica", size: 20.0)

var height = heightForView("This is just a load of text", font: font, width: 100.0)

Swift 3:

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    return label.frame.height
}

enter image description here

166
Anorak

AutoLayoutを使用している場合は、設定UIでのみUILabelの高さを調整できます。

iOS8以上の場合

  • あなたのUILabelのための制約の先頭/末尾を設定します
  • そしてUILabelの行を1から0に変更します。

enter image description here

iOS7の場合

  • 最初に、あなたはUILabelのために含む高さを加える必要があります
  • 次に、リレーションをEqualからGreater than or Equalに変更します。

enter image description here

  • 最後にUILabelの行を1から0に変更します。

enter image description here

あなたのUILabelはテキストに応じて自動的に高さを増やします

57
Phan Van Linh

あなたが望むなら私はこの拡張子を作成します

extension UILabel {
    func setSizeFont (sizeFont: CGFloat) {
        self.font =  UIFont(name: self.font.fontName, size: sizeFont)!
        self.sizeToFit()
    }
}
8
YannSteph

強力な解決策があります。

layoutSubviewsで:

    _title.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 0)
    _title.sizeToFit()
    _title.frame.size = _title.bounds.size

テキストセッターの場合:

    _title.text = newValue
    setNeedsLayout()

PD。このUILabel設定ではもちろん:

    _title.lineBreakMode = .ByWordWrapping
    _title.numberOfLines = 0
7
dimpiax

設定するだけで:

label.numberOfLines = 0

ラベルは入力されたテキストの量に基づいて自動的に高さを調整します。

6
Jordan Amman

anorakの答えに基づいて、私はZorayrの懸念にも同意するので、UILabelを削除してCGFloatのみを返すために数行を追加しました。エラーが発生しないので、以下のコードを使用します。

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{

    var currHeight:CGFloat!

    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    currHeight = label.frame.height
    label.removeFromSuperview()

    return currHeight
}
5
LeftyT

Swift 4.1とXcode 9.4.1の場合

のみステップ

ステップ1)

//To calculate height for label based on text size and width
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat {
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

ステップ2)

//Call this function
let height = heightForView(text: "This is your text", font: UIFont.systemFont(ofSize: 17), width: 300)
print(height)//Output : 41.0

ステップ3)

//This is your label
let proNameLbl = UILabel(frame: CGRect(x: 0, y: 20, width: 300, height: height))
proNameLbl.text = "This is your text"
proNameLbl.font = UIFont.systemFont(ofSize: 17)
proNameLbl.numberOfLines = 0
proNameLbl.lineBreakMode = .byWordWrapping
infoView.addSubview(proNameLbl)
4
iOS

AnorakがUILabelの拡張機能の計算プロパティとして提案した解決策:

extension UILabel
{
var optimalHeight : CGFloat
    {
        get
        {
            let label = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max))
            label.numberOfLines = 0
            label.lineBreakMode = self.lineBreakMode
            label.font = self.font
            label.text = self.text

            label.sizeToFit()

            return label.frame.height
         }
    }
}

使用法:

self.brandModelLabel.frame.size.height = self.brandModelLabel.optimalHeight)
3
Philipp Otto

@Anorakの回答に続いて、私はこの拡張をStringに追加し、パラメータとしてインセットを送信しました。なぜなら、あなたはあなたのテキストにパディングが必要になるでしょう。とにかく、多分あなたはこの便利を見つけるでしょう。

extension String {

    func heightForWithFont(font: UIFont, width: CGFloat, insets: UIEdgeInsets) -> CGFloat {

        let label:UILabel = UILabel(frame: CGRectMake(0, 0, width + insets.left + insets.right, CGFloat.max))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.ByWordWrapping
        label.font = font
        label.text = self

        label.sizeToFit()
        return label.frame.height + insets.top + insets.bottom
    }
}
3
Lirik

これはSwiftでテキストの高さを計算する方法です。四角形から高さを取得して、ラベルやtextViewなどの拘束の高さを設定できます。

let font = UIFont(name: "HelveticaNeue", size: 25)!
let text = "This is some really long text just to test how it works for calculating heights in Swift of string sizes. What if I add a couple lines of text?"

let textString = text as NSString

let textAttributes = [NSFontAttributeName: font]

let textRect = textString.boundingRectWithSize(CGSizeMake(320, 2000), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)
2
Collin

Swift 4.0

self.messageLabel = UILabel(フレーム:CGRect(x:70、y:60、幅:UIScreen.main.bounds.width - 80、高さ:30)

messageLabel.text = message

messageLabel.lineBreakMode = .byWordWrapping //in versions below Swift 3 (messageLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping)    
messageLabel.numberOfLines = 0 //To write any number of lines within a label scope

messageLabel.textAlignment = .center

messageLabel.textColor = UIColor.white

messageLabel.font = messageLabel.font.withSize(12)

messageLabel.sizeToFit()

Blockquote NSParagraphStyle.LineBreakMode、段落内の単語ではなく段落全体に適用されます。このプロパティは、通常の描画中およびラベルのテキストを境界ボックス内に収めるためにフォントサイズを小さくする必要がある場合の両方で有効です。このプロパティは、デフォルトでbyTruncatingTailに設定されています。

このリンクはストーリーボードで同じことをする方法を説明しています

2
7ur7l3

ラベルに動的なHeightが必要な場合は、このメソッドを呼び出すだけです。

func getHeightforController(view: AnyObject) -> CGFloat {
    let tempView: UILabel = view as! UILabel
    var context: NSStringDrawingContext = NSStringDrawingContext()
    context.minimumScaleFactor = 0.8

    var width: CGFloat = tempView.frame.size.width

    width = ((UIScreen.mainScreen().bounds.width)/320)*width

    let size: CGSize = tempView.text!.boundingRectWithSize(CGSizeMake(width, 2000), options:NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: tempView.font], context: context).size as CGSize

    return size.height
}
1
Shubham bairagi

ラベルの高さを計算するためのSwift 4.1拡張メソッド

extension UILabel {

    func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat {
        let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.font = font
        label.text = text

        label.sizeToFit()
        return label.frame.height
    }

}
1
user7718859

Swift 4.

テキスト/ラベルの高さを計算する代わりに、(動的な)テキストを挿入した後にラベルのサイズを変更します。

MyLabelが問題のUILabelであると仮定します。

let myLabel = UILabel(frame: CGRect(x: 0, y: 0, width: *somewidth*, height: *placeholder, e.g. 20*))
myLabel.numberOfLines = 0
myLabel.lineBreakMode = .byWordWrapping
...

そして今楽しい部分が来ます:

var myLabelText: String = "" {
   didSet {
      myLabel.text = myLabelText
      myLabel.sizeToFit()
   }
}
1
Patrick J.

Swiftでラベルを動的にするには、高さconstarintを与えず、ストーリーボードで行番号0のラベルに下制約を与えます。これは、コンテンツサイズごとに動的ラベルを処理する最良の方法です。

0
Ranjeet Raushan