如何在Swift中以编程方式为UILabel提供动态高度?

17

我用for循环动态生成了多个UILabel,每个UILabel都有不同的文本内容,我想根据文本动态地调整UILabel的大小。

在Swift中是否存在简单的解决方案?


你在使用AutoLayout吗? - Bannings
是的,我已经在Storyboard中使用了它,但还没有在代码中使用过。 - New iOS Dev
8个回答

11
let label:UILabel = UILabel(frame: CGRectMake(x, y, width, height))
label.numberOfLines = 4
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
let font = UIFont(name: "Helvetica", size: 20.0)
label.font = font
label.text = "Whatever you want the text enter here"
label.sizeToFit()

如果你想根据文本内容来设置numberOfLines属性,那就给出最大行数。这在这里非常重要。


我应该传入“heigh”什么? - New iOS Dev
1
你可以传递任何值给“height”,因为sizeToFit()函数会再次调整高度以适应内容。 - Amr Hossam

5

根据标签的文本内容、字体和宽度,获取标签的高度:

func rectForText(text: String, font: UIFont, maxSize: CGSize) -> CGSize {
        let attrString = NSAttributedString.init(string: text, attributes: [NSFontAttributeName:font])
        let rect = attrString.boundingRectWithSize(maxSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, context: nil)
        let size = CGSizeMake(rect.size.width, rect.size.height)
        return size
    }

let labelSize = rectForText("your text here", font: UIFont.systemFontOfSize(your font), maxSize: CGSizeMake(your label width,999))
let labelHeight = labelSize.height //here it is!

这对我非常有效!我使用了相同的代码,只是更新为Swift 3。 - Simon
@May Phyu,我刚刚编辑了更新内容,如果你还需要的话,审核通过后就会出现在这里! - Josh Heald

5
    myLabel.text = "Your Label Text Here"

    myLabel.textAlignment = .Natural

    myLabel.numberOfLines = 0

    myLabel.sizeToFit()

    myLabel.frame = CGRectMake(myLabel.frame.origin.x, myLabel.frame.origin.y, 280, myLabel.frame.height)

2
let label:UILabel = UILabel()
label.textColor=UIColor.black
label.font = UIFont(name: "Halvetica", size: 17)
label.numberOfLines = 1

label.text = item.name
label.sizeToFit()

label.frame = CGRect(x: 5, y: imageView.frame.height+10, width: 50, height:label.frame.height)

我认为这对你有帮助。 - D.l.Prasad

2

创建扩展程序来计算标签的高度,以下方法返回标签的高度

Original Answer翻译成"最初的回答"

 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: 60)

1
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
    }

}

参考:调整UILabel高度以适应文本


1
let label = UILabel()
label.backgroundColor = UIColor.greenColor()
label.text = "Hello,world.\n Just a test."
let font = UIFont.systemFontOfSize(17.0)
label.font = font
label.numberOfLines = 0;
let text = label.text! as NSString
let size = text.sizeWithAttributes([NSFontAttributeName:font])
label.frame = CGRectMake(0, 0, size.width, size.height)

你可以在代码中使用自动布局。查看自动布局指南

0
NSString(string: "hello this is a string").boundingRect(
        with: CGSize(width: width, height: .greatestFiniteMagnitude),
        options: .usesLineFragmentOrigin,
        attributes: [.font: self],
        context: nil).size

使用此方法来确定字符串的大小。将最大高度和最大宽度放入CGSize(widhth,height)中,它将返回包含高度和宽度的CGSize对象。根据您的情况使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接