ios – 以编程方式设置文本后获取UILabel的大小

将一些字符串值设置为UILabel的text属性时

var a : UILabel
a.text = "Variable length string"

autolayout使用约束字体大小,标签行数等来调整大小.

问题是,如果我需要获得该标签的大小以便我(例如)可以决定包含此标签的表格单元应该有多高,我应该在什么时候成功完成此操作?

试图在不使用UITableviewAutomaticDimension的情况下解决这个问题.

编辑:作为可能重复发布的答案有一些相似之处.然而,我的主要困惑在于我能够成功且确定地提取UILabel的高度.

已经多次尝试获取视图的大小,但我得到的值不准确,需要采用某种形式使用viewDidLayoutSubviews().我想我不明白布局中发生的事情顺序.对于viewDidLoad()和awakeFromNib()似乎也有所不同,但我可能会对此有所误解.

如果有人能指出我理解这个方向的正确方向,我将不胜感激

最佳答案 尝试使用tableView在ViewController中实现以下方法:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
             return HeightCalculator.height(with: text, inViewController: self)
}

然后添加以下类:

import UIKit

class HeightCalculator {
    let title: String
    let viewController: UIViewController

    class func height(with title: String, inViewController viewController: UIViewController) -> CGFloat {
        let calculator = HeightCalculator(title: title, viewController: viewController)

        return calculator.height
    }

    init(title: String, viewController: UIViewController) {
        self.title = title
        self.viewController = viewController
    }

    var height: CGFloat {
        let contentHeight = title.heightWithConstrainedWidth(width: defaultWidth, font: UIFont.preferredFont(forTextStyle: UIFontTextStyle.title1))
    }
}

您需要在String上使用以下扩展名来获取高度:

import UIKit

extension String {
    func heightWithConstrainedWidth(width: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

        return boundingBox.height
    }
}

使用heightForRowAt计算高度,计算它的计算器类(contentHeight)和获得高度的扩展.您可以调整计算器类以传递字体,以便它可以使用此字体将其传递给heightWithConstrainedWidth方法.

点赞