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

时间:2012-10-08 20:11:59

标签: ios autolayout

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

感谢您的帮助。

3 个答案:

答案 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 警告。