Swift 3 UILabel获取实际高度(intrinsicContentSize)

时间:2017-04-03 13:03:19

标签: ios iphone swift

我正试图模拟一种“请等待......”UILabel。标签的文本必须定期更新。到目前为止一切都按预期工作。但是,我需要获得标签的内在内容高度才能定位其容器视图(UIView)。

enter image description here

标签是具有红色背景的标签,而具有白色背景的标签是其容器。

不幸的是,我尝试了一些不同的方法,都是徒劳的。任何帮助将不胜感激。

private func createBusyLabel(labelText: String) -> CGFloat {

    self.busyViewContainer.addSubview(self.busyLabel)

    self.busyLabel.backgroundColor = UIColor.red

    self.busyLabel.numberOfLines = 0
    self.busyLabel.lineBreakMode = NSLineBreakMode.byWordWrapping
    self.busyLabel.sizeToFit()

    //set the constraints, but skip height constraints
    self.busyLabel.translatesAutoresizingMaskIntoConstraints = false
    self.busyLabel.horizontalLeft(toItem: self.busyViewContainer, constant: 60)
    self.busyLabel.horizontalRight(toItem: self.busyViewContainer, constant: -10)
    self.busyLabel.topConstraints(toItem: self.busyViewContainer, constant: 10)


    self.busyLabel.text = labelText
    //calculate height with margin
    let height: CGFloat = self.busyLabel.intrinsicContentSize.height + 20
    return height

}

此外,来自先前已询问且已经回答的question的行计数功能仅提供1

这是我设置底部约束后的样子:

enter image description here

2 个答案:

答案 0 :(得分:0)

简单的修复是在'self.busyViewContainer'和它的superview之间添加底部约束。

遵循您的代码和语法,它可以是这样的:

self.busyLabel.bottomConstraints(toItem: self.busyViewContainer, constant: 10)

这是“不满意的约束”的常见问题。自动布局应确保其满足水平轴布局,因此在这种情况下需要同时具有顶部和底部约束。

Apple doc - Unsatisfiable Constraints

Apple doc - Logical Errors

UPD:在这种情况下,超级视图的布局可以使用intrinsicContentSize定义高度:

var intrinsicContentSize: CGSize { return ... }

如果父视图的高度将根据标签1计算。

答案 1 :(得分:0)

百万感谢ozgur,他改变了我的方法。 Ozgur,你的代码很完美,但遗憾的是不适合我,因为我遇到了bottomLayoutGuide部分的问题。原因是标签及其容器是在外部类中创建的。

之前我尝试将标签的底部约束设置为未返回预期结果。然而,受到ozgur的回答的启发,这次我只是将底部约束设置为其容器而不是标签,给出预期结果,如下所示:

    self.busyViewContainer.bottomConstraints(toItem: self.busyLabel, constant: 10)

感谢所有付出宝贵努力的人。

private func createBusyLabel(labelText: String) -> Void {

    self.busyLabel.text = labelText
    self.busyLabel.font = UIFont.getGlobalFont(size: _textSizeSmall, type: "bold")

    self.busyLabel.backgroundColor = UIColor.red

    // handle multiline problem
    self.busyLabel.numberOfLines = 0
    self.busyLabel.lineBreakMode = NSLineBreakMode.byWordWrapping
    self.busyLabel.sizeToFit()

    self.busyViewContainer.addSubview(self.busyLabel)
    self.busyLabel.translatesAutoresizingMaskIntoConstraints = false
    self.busyLabel.horizontalLeft(toItem: self.busyViewContainer, constant: 60)
    self.busyLabel.horizontalRight(toItem: self.busyViewContainer, constant: -10)
    self.busyLabel.topConstraints(toItem: self.busyViewContainer, constant: 10)

    // the following line made the difference
    self.busyViewContainer.bottomConstraints(toItem: self.busyLabel, constant: 10)

}

enter image description here