更改自动布局常量不会更新其帧

kev*_*kev 6 iphone uibutton uiview ios autolayout

我已经创建了一个小信息视图,我想将其添加为UIVisualEffectView的子视图.在我的信息视图中,我创建了一个自由格式的xib,并为所有UILabel和一个UIButton使用了自动布局.这里的目标是Start,PullSled都是可选的,所以如果那个数据不存在,我想要折叠那些UILabel.我通过将等高度约束更新为0 来完成此操作.

我的问题是,当这些可选的UIlabels中的部分或全部崩溃时,我想更新UIView框架的高度,以便整洁,不会有间隙.

在此输入图像描述

我在下面做了更新我在IB中标记的约束.

    for view in self.view.subviews {
        for constraint in view.constraints {
            if let identity = constraint.identifier {
                if labelTags.contains(identity) {
                    print("Before: \(view.frame)")
                    constraint.constant = labelHeight
                    view.setNeedsUpdateConstraints()
                    print("After: \(view.frame)")
                }
            }
        }
    }

Before: (5.0, 101.0, 50.0, 25.0)
After: (5.0, 101.0, 50.0, 25.0)
Before: (58.0, 101.0, 101.0, 25.0)
After: (58.0, 101.0, 101.0, 25.0)
Before: (5.0, 129.0, 39.0, 25.0)
After: (5.0, 129.0, 39.0, 25.0)
Before: (47.0, 129.0, 23.0, 25.0)
After: (47.0, 129.0, 23.0, 25.0)
Before: (5.0, 157.0, 45.0, 25.0)
After: (5.0, 157.0, 45.0, 25.0)
Before: (53.0, 157.0, 63.0, 25.0)
After: (53.0, 157.0, 63.0, 25.0)
Run Code Online (Sandbox Code Playgroud)

更新约束后,我尝试通过循环视图子视图来确定视图的帧,并获得最大高度,如下所示:

    var height:CGFloat = 0.0
    for v in self.view.subviews {
        if (v.frame.origin.y + v.frame.size.height) > height {
            height = (v.frame.origin.y + v.frame.size.height)
        }
    }

    self.frame.size.height = height
Run Code Online (Sandbox Code Playgroud)

在第一次加载时,获取新帧高度不起作用,因为UILabels帧在更新其约束后不会更新.这是踢球者,相同的代码运行方向更改,它的工作原理!当我旋转回到肖像时,我的所有人UILabels都很好地排成一行,然后UIView被舒缓地拉起来UIButton!

任何方向都会非常感激,我已经在这两天了.谢谢!

更新:

self.view.layoutIfNeeded()确实是赢家!在我的情况下,时机就是一切.

我从未接受过如此密切的关注,但下面的内容似乎更像是对操作系统的"建议" layoutIfNeeded().

self.view.setNeedsUpdateConstraints()
self.view.setNeedsLayout()
self.view.setNeedsDisplay()
Run Code Online (Sandbox Code Playgroud)

Sir*_*iss 9

调用layoutIfNeeded(),这将强制重绘具有AutoLayout约束更改的视图.它也会打电话viewDidLayoutSubviews,所以你可以在那里做任何额外的工作.