如何在Swift中以编程方式创建动态标签大小?

4

我想在Swift中以编程方式创建标签,但我遇到的问题是,基于数据模型,文本量可能会发生变化,从而改变标签的大小。通常,在了解文本之前,我会像这样创建标签:

headerLabel.frame = CGRect(x: 0, y: 0, width: screenSize.width/2.5, height: screenSize.height/45)
headerLabel.center = CGPoint(x: screenSize.width/2, y: 245)

但在这种情况下,文本的长度可以是从一行到一个段落不等,因此硬编码高度不可行。如何创建标签,以适应任意数量的文本?


将行数设置为0。 - Shades
这是通过编程完成的,那么怎样才能设置框架? - SwiftyJD
3个回答

17

在将文本提供给标签后,您可以访问标签的内在属性,然后可以为其设置框架。

Swift 3:

let label = UILabel()
label.text = "Your text here"
label.textAlignment = .center
label.font = UIFont.systemFont(ofSize: 14)
label.frame = CGRect(x:0,y:0,width:label.intrinsicContentSize.width,height:label.intrinsicContentSize.height)

您可以基于intrinsicContentSize检查一些条件。

希望这有所帮助。


1
你使用了label.intrinsicContentSize.width作为宽度和高度。 - Scooter
谢谢!它帮了我很多.. +10 :) - Rafaela Lourenço

4

这个标签有一个定义好的宽度但是没有定义高度。高度由标签内文本的多少来决定。如果你移除了宽度,标签将不会自动换行,这并不是你想要的结果。在结尾处调用sizeToFit()方法后,标签会根据文本内容需要分成几行来设置高度。如果这不是你想要的,请告诉我。

let label = UILabel()
label.text = "scones"
label.numberOfLines = 0 // 0 = as many lines as the label needs
label.frame.origin.x = 32
label.frame.origin.y = 32
label.frame.size.width = view.bounds.width - 64
label.font = UIFont.displayHeavy(size: 17) // my UIFont extension
label.textColor = UIColor.black
label.sizeToFit()
view.addSubview(label)

3
您可以使用以下方法计算字符串的高度和宽度,然后进行设置:
import Foundation
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let width = "Hello World".stringWidth // 74.6
        let height = "Hello World".stringHeight // 16.7

        let headerLabel = UILabel()
        headerLabel.frame = CGRect(x: 0, y: 0, width: width, height: height)
        headerLabel.center = CGPoint(x: screenSize.width/2, y: 245)
    }
}

extension String {
    var stringWidth: CGFloat {
        let constraintRect = CGSize(width: UIScreen.main.bounds.width, height: .greatestFiniteMagnitude)
        let boundingBox = self.trimmingCharacters(in: .whitespacesAndNewlines).boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14)], context: nil)
        return boundingBox.width
    }

    var stringHeight: CGFloat {
        let constraintRect = CGSize(width: UIScreen.main.bounds.width, height: .greatestFiniteMagnitude)
        let boundingBox = self.trimmingCharacters(in: .whitespacesAndNewlines).boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14)], context: nil)
        return boundingBox.height
    }
}

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