【问题标题】:Force UIView with zero height to lay out its subviews强制 UIView 高度为零来布置其子视图
【发布时间】:2021-06-17 13:10:54
【问题描述】:

我有一个UIView,里面有一些标签。标签具有取决于文本的动态高度,并且它们对父视图和彼此具有垂直间距约束,从而为父视图提供了高度。最后一个标签的底部和父视图底部之间的约束设置为具有较低的优先级。

另外,父视图有一个高度限制,我在viewDidLoad 中设置为0。这会折叠视图并将所有标签向下推,因为最后一个底部约束具有较低的优先级。然后我有一个按钮,我可以在其中切换父视图的高度约束,它可以打开/关闭它:

@IBAction func viewInfoButtonTapped(_ sender: Any) {
    viewInfoButton.isSelected = !viewInfoButton.isSelected
    
    self.infoHeightConstraint.isActive = !self.viewInfoButton.isSelected
    UIView.animate(withDuration: 0.25) {
        self.view.layoutIfNeeded()
    }
}

我的问题是标签的动态高度直到我第一次展开父视图时才设置,所以不是简单地显示标签的动画,而是显示标签并增加高度的效果同时。第一次展开后,高度已经设置好了,后续的展开会给出正确的效果。

如何强制视图在第一次展开之前正确布置约束? 我试过打电话给setNeedsLayout()layoutIfNeeded(),但是好像没有效果。

【问题讨论】:

    标签: ios uiview autolayout


    【解决方案1】:

    在您的每个标签上将垂直 Content Compression Resistance 优先级设置为Required (1000)

    或者,由于您可能会在运行时循环遍历它们以设置每个文本中的文本,因此您可以通过代码来完成:

    label.text = someString
    label.setContentCompressionResistancePriority(.required, for: .vertical)
    

    这应该可以解决您不想要的初始“拉伸”问题。

    如果您仍然看到拉伸(不应该,但以防万一),您也可以致电sizeToFit()

    label.text = someString
    label.setContentCompressionResistancePriority(.required, for: .vertical)
    label.sizeToFit()
    

    【讨论】:

    • 设置压缩阻力修复它,谢谢!
    猜你喜欢
    • 2023-03-12
    • 2017-11-03
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多