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

时间:2017-09-28 21:00:36

标签: ios swift dynamic uilabel frame

我正在尝试以编程方式在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)

但是在这种情况下,文本可以是从一行到一个段落的任何数量,因此硬编码高度将不起作用。如何创建标签以便它可以容纳任何数量的文本?

3 个答案:

答案 0 :(得分:6)

您可以在将文本提供给标签后访问标签内在属性,然后您可以给出框架。

斯威夫特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.width)

您可以根据intrinsicContentSize检查某些条件。

希望它有所帮助。

答案 1 :(得分:3)

此标签具有已定义的宽度,但未定义高度。高度由标签中的文本数量决定。如果删除了宽度,标签就不会分成线条,这不是你想要的。最后调用的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)

答案 2 :(得分:2)

您可以使用以下方法计算字符串的高度和宽度,然后设置它们:

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