我有一个在代码中执行其子视图布局的视图。布局对于自动布局来说太复杂了,自动布局会破坏布局代码。有没有办法强制自动布局让这个视图的子视图单独存在?我尝试过覆盖 layoutSubviews,但没有任何乐趣。
谢谢你的帮助。
我有一个在代码中执行其子视图布局的视图。布局对于自动布局来说太复杂了,自动布局会破坏布局代码。有没有办法强制自动布局让这个视图的子视图单独存在?我尝试过覆盖 layoutSubviews,但没有任何乐趣。
谢谢你的帮助。
每个情节提要或 XIB 启用或禁用自动布局。如果您的视图位于其自己的 XIB 中,那么您可以禁用该 XIB 的自动布局。如果您的 XIB 中还有其他依赖于自动布局的视图,则您必须找到不同的解决方案。
在 WWDC 视频中找到了答案。layoutSubviews 在自动布局下的工作方式与以前不同。它不会阻止自动布局的发生,而是在布局期间添加/更改/删除约束的机会。
昨晚我尝试将自定义视图移动到不同的 NIB,这似乎是唯一的解决方案。
只要视图的子视图不涉及任何会触发该视图上的另一个自动布局传递的自动布局约束,您就可以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就不会发出警告。