Ios 以编程方式设置文本后获取UILabel的大小
将某些字符串值设置为UILabel的文本属性时,如Ios 以编程方式设置文本后获取UILabel的大小,ios,swift,uitableview,autolayout,uilabel,Ios,Swift,Uitableview,Autolayout,Uilabel,将某些字符串值设置为UILabel的文本属性时,如 var a : UILabel a.text = "Variable length string" autolayout使用字体大小、标签行数等约束调整其大小 问题是,如果我需要得到该标签的大小,以便(例如)决定包含该标签的tablecell应该有多高,我应该在什么时候成功地这样做 尝试在不使用UITableviewAutomaticDimension的情况下解决此问题 编辑:作为可能的副本发布的答案有一些相似之处。然而,我的主要困惑是,在哪
var a : UILabel
a.text = "Variable length string"
autolayout使用字体大小、标签行数等约束调整其大小
问题是,如果我需要得到该标签的大小,以便(例如)决定包含该标签的tablecell应该有多高,我应该在什么时候成功地这样做
尝试在不使用UITableviewAutomaticDimension的情况下解决此问题
编辑:作为可能的副本发布的答案有一些相似之处。然而,我的主要困惑是,在哪里可以成功且确定地提取UILabel的高度
我已经多次尝试获取视图的大小,但返回的值不准确,需要以某种形式使用viewDidLayoutSubviews()。我想我不太明白布局中事情发生的顺序。viewDidLoad()和awakeFromNib()的情况似乎也不一样,但我可能误解了这一点
如果有人能为我指出正确的理解方向,我将不胜感激尝试在您的ViewController中使用tableView实现以下方法:
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))
}
}
要获得高度,字符串上需要以下扩展名:
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
方法。heightWithConstrainedWidth可能重复。肯定是我的分机!谢谢