选择退出单个视图的自动布局?

我有一个视图,在代码中执行其子视图的布局。 布局对于自动布局来说太复杂,并且自动布局会破坏布局代码。 有没有办法强制自动布局单独保留此视图的子视图? 我试过覆盖layoutSubviews,但没有快乐。

谢谢你的帮助。

每个故事板或XIB启用或禁用自动布局。 如果您的视图位于其自己的XIB中,则可以禁用该XIB的自动布局。 如果您的XIB中有其他依赖于自动布局的视图,则必须找到不同的解决方案。

在WWDCvideo中找到了答案。 layoutSubviews在自动布局下的工作方式与以前不同。 它不会阻止自动布局发生,而是在布局期间添加/更改/删除约束的机会。

昨晚我尝试将自定义视图移动到另一个NIB,这似乎是唯一的解决方案。

您可以混合自动布局和手动布局!

只要视图的任何子视图都不涉及任何会触发该视图上的另一个自动布局传递的自动布局约束,您就可以覆盖layoutSubviews并手动设置每个子视图上的框架:

 class MyView : UIView { // // mySubview is not involved in any constraints // that would trigger another layout pass. // eg, 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就不会发出警告。