kev*_*kev 6 iphone uibutton uiview ios autolayout
我已经创建了一个小信息视图,我想将其添加为UIVisualEffectView的子视图.在我的信息视图中,我创建了一个自由格式的xib,并为所有UILabel和一个UIButton使用了自动布局.这里的目标是Start,Pull和Sled都是可选的,所以如果那个数据不存在,我想要折叠那些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)
调用layoutIfNeeded(),这将强制重绘具有AutoLayout约束更改的视图.它也会打电话viewDidLayoutSubviews,所以你可以在那里做任何额外的工作.
| 归档时间: |
|
| 查看次数: |
3557 次 |
| 最近记录: |