最近在学习swift做动画,用到constraint的动画,用到layoutIfNeeded就去研究了下UIView的这几个布局的方法。
下面是做得一个动画,下载地址:https://github.com/smalldu/IOS-Animations
中的AnimationDemo3
动画
下面列举下iOS layout的相关方法:
- layoutSubviews
- layoutIfNeeded
- setNeedsLayout
- setNeedsDisplay
- drawRect
- sizeThatFits
- sizeToFit
大概常用的上面几个 , 具体的应该还有别的。
layoutSubviews
这个方法,默认没有做任何事情,需要子类进行重写 。 系统在很多时候会去调用这个方法:
1.初始化不会触发layoutSubviews,但是如果设置了不为CGRectZero的frame的时候就会触发。
2.addSubview会触发layoutSubviews
3.设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4.滚动一个UIScrollView会触发layoutSubviews
5.旋转Screen会触发父UIView上的layoutSubviews事件
6.改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
在苹果的官方文档中强调: You should override this method only if
the autoresizing behaviors of the subviews do not offer the behavior
you want.layoutSubviews,
当我们在某个类的内部调整子视图位置时,需要调用。反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。
setNeedsLayout
标记为需要重新布局,不立即刷新,但layoutSubviews一定会被调用
配合layoutIfNeeded立即更新
layoutIfNeeded
如果,有需要刷新的标记,立即调用layoutSubviews进行布局
这个动画中有用到 举个栗子