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

时间:2016-05-12 02:55:38

标签: ios iphone uiview uibutton autolayout

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

我的问题是当部分或全部可选的UI标签崩溃时,我想要更新UIView的框架高度,以便整洁,并且不会有间隙。

enter image description here

我执行以下操作来更新我在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)

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

    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

首次加载获取新的帧高度不起作用,因为UILabels帧在更新其约束后不会更新。这是踢球者,相同的代码在方向更改时运行并且它可以正常工作!当我回到纵向时,我的所有UILabels都排成一行,而UIViewUIButton下舒适地拉起来!

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

更新:

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

我从未接受过密切关注,但下面似乎更像是对操作系统的“建议”,而layoutIfNeeded()是即时的。

self.view.setNeedsUpdateConstraints()
self.view.setNeedsLayout()
self.view.setNeedsDisplay()

1 个答案:

答案 0 :(得分:8)

调用git verify-pack -v .git/objects/pack/pack-<smth>.idx,这将强制重绘具有AutoLayout约束更改的视图。它还会调用layoutIfNeeded(),因此您可以在那里进行任何其他工作。