将UILabel高度调整为文本

The*_*hot 102 height frame uilabel ios swift

我有一些标签,我想调整它们的高度到文本,这是我现在为此写的代码

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
}
Run Code Online (Sandbox Code Playgroud)

编辑:

问题不在于这段代码,所以我的问题就在于问题本身.它可能对其他人有用!

Ano*_*rak 174

我刚把它放在一个操场上,它对我有用.

针对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)
Run Code Online (Sandbox Code Playgroud)

斯威夫特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
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 它在游乐场中工作,但在XCode 6.1中的视图控制器内没有按照需要进行大小调整 (6认同)
  • 我有点犹豫要不要为每个尺寸创建一个新的“UILabel”;如果在 `layoutSubviews` 中使用这个方法,并且每个完整的布局往往会被多次调用,额外的对象创建可能会引入明显的延迟,尤其是在滚动期间。 (2认同)

Pha*_*inh 59

如果您使用的是AutoLayout,则UILabel只能通过配置UI 调整高度.

适用于iOS8或以上版本

  • 设置约束前导/尾随 UILabel
  • 并将行数UILabel从1 更改为0

在此输入图像描述

适用于iOS7

  • 首先,您需要添加包含高度UILabel
  • 然后,修改从关系EqualGreater than or Equal

在此输入图像描述

  • 最后,将行UILabel从1 更改为0

在此输入图像描述

UILabel将根据文字自动增加高度

  • 这对我来说非常合适!设置约束,它将正常工作! (3认同)
  • 并且如果标签在单元格内。您何时以及如何相应地增加像元高度? (2认同)
  • 不适合我... UILabel中的"标签"一词使得身高= 20.此设置后仍为20. (2认同)

Yan*_*eph 9

如果你愿意,我会创建这个扩展

extension UILabel {
    func setSizeFont (sizeFont: CGFloat) {
        self.font =  UIFont(name: self.font.fontName, size: sizeFont)!
        self.sizeToFit()
    }
}
Run Code Online (Sandbox Code Playgroud)


dim*_*iax 8

我有强大的工作解决方案.

在layoutSubviews中:

    _title.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 0)
    _title.sizeToFit()
    _title.frame.size = _title.bounds.size
Run Code Online (Sandbox Code Playgroud)

在文本setter中:

    _title.text = newValue
    setNeedsLayout()
Run Code Online (Sandbox Code Playgroud)

UPD. 当然还有这个UILabel设置:

    _title.lineBreakMode = .ByWordWrapping
    _title.numberOfLines = 0
Run Code Online (Sandbox Code Playgroud)


小智 6

只需设置:

label.numberOfLines = 0
Run Code Online (Sandbox Code Playgroud)

标签会根据输入的文本量自动调整其高度.

  • 这并不能使UILabel调整它的高度. (24认同)

Lef*_*tyT 6

根据Anorak的回答,我也同意Zorayr的关注,所以我添加了几行来删除UILabel并仅返回CGFloat,我不知道它是否有帮助,因为原始代码没有添加UIabel,但它不会抛出错误,所以我使用下面的代码:

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
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*tto 5

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
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

self.brandModelLabel.frame.size.height = self.brandModelLabel.optimalHeight
Run Code Online (Sandbox Code Playgroud)

  • 无法分配给属性:“height”是仅获取属性。 (2认同)

iOS*_*iOS 5

在Swift 4.1和Xcode 9.4.1中

3步

步骤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
}
Run Code Online (Sandbox Code Playgroud)

第2步)

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

第三步

//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)
Run Code Online (Sandbox Code Playgroud)