将一些字符串值设置为UILabel的文本属性,如
var a : UILabel
a.text = "Variable length string"
autolayout使用约束字体大小,标签行数等来调整大小。
问题是,如果我需要获得该标签的大小以便我(例如)可以决定包含此标签的表格单元应该有多高,在什么时候我应该做什么这成功了吗?
尝试在不使用UITableviewAutomaticDimension的情况下解决这个问题。
编辑:作为可能重复发布的答案有一些相似之处。然而,我的主要困惑在于我能够成功且确定地提取UILabel的高度。
我曾经多次试图获得视图的大小,但我得到的值并不准确,需要采用某种形式使用 viewDidLayoutSubviews()。我想我不明白布局中发生的事情顺序。对于viewDidLoad()和awakeFromNib()似乎也有所不同,但我可能会对此感到误解。
如果有人能指出我理解这个方向的正确方向,我将不胜感激
答案 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
方法。