ViewController
-
- (void)viewWillLayoutSubviewslayoutSubviews方法前执行 -
- (void)viewDidLayoutSubviewslayoutSubviews方法后执行 -
- (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有改变, 很神奇)