我有一个在代码中执行子视图布局的视图。布局对于自动布局来说太复杂,并且自动布局会破坏布局代码。有没有办法强制自动布局单独保留此视图的子视图?我试过覆盖layoutSubviews,但没有快乐。
感谢您的帮助。
答案 0 :(得分:5)
每个故事板或XIB启用或禁用自动布局。如果您的视图位于其自己的XIB中,则可以禁用该XIB的自动布局。如果您的XIB中有其他视图依赖于自动布局,则必须找到不同的解决方案。
答案 1 :(得分:2)
在WWDC视频中找到答案。 layoutSubviews在自动布局下的工作方式与以前不同。它不会阻止自动布局发生,而是在布局期间添加/更改/删除约束的机会。
昨晚我尝试将自定义视图移动到另一个NIB,这似乎是唯一的解决方案。
答案 2 :(得分:2)
You can mix auto layout and manual layout!
只要 无 视图的子视图涉及 任何 自动布局限制这将触发该视图上的另一个自动布局传递,您可以覆盖layoutSubviews
并手动设置每个子视图上的帧:
class MyView : UIView {
//
// mySubview is not involved in any constraints
// that would trigger another layout pass.
// e.g., no explicit constraints set in IB.
//
@IBOutlet weak var mySubview: UIView!
override func layoutSubviews() {
super.layoutSubviews() // let auto layout engine run first
//
// Auto layout engine now done with this view so we can
// set the frames how ever we wish since we have the last
// word!
//
mySubview.frame = CGRectMake(...)
...
}
}
这样做的原因是在调用super.layoutSubviews()
之后,更改任何子视图上的帧不会触发另一个布局传递(与子视图相关的所有约束都会得到满足,并且自动布局引擎完成了他们);
因此,这个方法得到了子视图位置的最后一个字!
请注意,MyView
个实例可以设置相关的自动布局约束,一切正常。
IB就会发出 no 警告。