我已经创建了一个小信息视图,我想将其添加为UIVisualEffectView的子视图。在我的信息视图中,我创建了一个自由格式的xib,并为所有UILabel和一个UIButton使用了自动布局。这里的目标是开始,拉和雪橇都是可选的,所以如果该数据不存在,我想要折叠那些UILabel。我通过将相等高度约束更新为0来完成此任务。
我的问题是当部分或全部可选的UI标签崩溃时,我想要更新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)
更新约束后,我尝试通过循环视图子视图来确定视图的帧,并获得最大高度,如下所示:
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
都排成一行,而UIView
在UIButton
下舒适地拉起来!
任何方向都会非常感激,我已经在这两天了。谢谢!
更新:
self.view.layoutIfNeeded()
确实是赢家!在我的情况下,时机就是一切。
我从未接受过密切关注,但下面似乎更像是对操作系统的“建议”,而layoutIfNeeded()
是即时的。
self.view.setNeedsUpdateConstraints()
self.view.setNeedsLayout()
self.view.setNeedsDisplay()
答案 0 :(得分:8)
调用git verify-pack -v .git/objects/pack/pack-<smth>.idx
,这将强制重绘具有AutoLayout约束更改的视图。它还会调用layoutIfNeeded()
,因此您可以在那里进行任何其他工作。