Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 以编程方式设置文本后获取UILabel的大小_Ios_Swift_Uitableview_Autolayout_Uilabel - Fatal编程技术网

Ios 以编程方式设置文本后获取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的情况下解决此问题 编辑:作为可能的副本发布的答案有一些相似之处。然而,我的主要困惑是,在哪

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

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可能重复。肯定是我的分机!谢谢