我正试图模拟一种“请等待......”UILabel。标签的文本必须定期更新。到目前为止一切都按预期工作。但是,我需要获得标签的内在内容高度才能定位其容器视图(UIView)。
标签是具有红色背景的标签,而具有白色背景的标签是其容器。
不幸的是,我尝试了一些不同的方法,都是徒劳的。任何帮助将不胜感激。
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
这是我设置底部约束后的样子:
答案 0 :(得分:0)
简单的修复是在'self.busyViewContainer'和它的superview之间添加底部约束。
遵循您的代码和语法,它可以是这样的:
self.busyLabel.bottomConstraints(toItem: self.busyViewContainer, constant: 10)
这是“不满意的约束”的常见问题。自动布局应确保其满足水平轴布局,因此在这种情况下需要同时具有顶部和底部约束。
Apple doc - Unsatisfiable Constraints
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)
}