Auto Layout 各方法简介

330 阅读2分钟

ViewController

  • - (void)viewWillLayoutSubviews layoutSubviews方法前执行

  • - (void)viewDidLayoutSubviews layoutSubviews方法后执行

  • - (void)updateViewConstraints 重写当前view的约束 当界面约束更新时,会调用此方法 重写这个方法时,一定要调用[super updateConstraints] 同UIView -updateConstraints


UIView

  • - (void)layoutSubviews 默认没有做任何事情, 当约束不能提供我们想要的布局效果时候,重写此方法, 可以调整自己子视图的frame。

    ###触发规则  * init初始化不会触发layoutSubviews,但用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发  * addSubview会触发layoutSubviews  * 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化  * 滚动一个UIScrollView会触发layoutSubviews  * 旋转Screen会触发父UIView上的layoutSubviews事件  * 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

  • - (BOOL)needsUpdateConstraints 布局系统使用这个返回值来确定是否调用updateConstraints

  • - (void)setNeedsUpdateConstraints 修改needsUpdateConstraints的返回值为YES 当一个View的属性改变会影响到界面布局时,调用这个方法通知布局系统在未来某个时刻需要更新, 系统会调用updateConstraints去更新布局。

会调用view和subViews的updateConstraints和layoutSubviews方法 及所在ViewController的viewDidLayoutSubviews和viewDidLayoutSubviews (但!View并不会有改变, 很神奇)

  • - (void)updateConstraintsIfNeeded 调用这个方法可以触发update Constraints操作。当needsUpdateConstraints返回YES时,才能成功触发update Constraints的操作。我们不应该重写这个方法。

若修改了view.frame,则会调用view和subViews的layoutSubviews, 没有修改就不会自动调用 (但!View并不会有改变, subViews有改变,很神奇)

  • - (void)setNeedsLayout 将view当前的layout设置为无效,并在下一个update cycle里去触发layout更新,会触发view的layoutSubView方法。

会调用view和subViews的layoutSubviews方法 (但!View有改变,subViews并不会有改变 , 很神奇)

  • - (void)layoutIfNeeded 强制立即更新layout,调用此方法会强制整个view更新布局。

若修改了view.frame,则会调用view和subViews的layoutSubviews, 没有修改就不会自动调用 (但!View并不会有改变, subViews有改变, 很神奇)