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

时间:2017-03-24 08:40:00

标签: ios swift uitableview autolayout uilabel

将一些字符串值设置为UILabel的文本属性,如

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

尝试使用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方法。