有时候我们在开发或者是看其他人编写的组件的时候 经常会看到子类重写了layoutSubviews
的方法子类调用了有时候又会调用setNeedsLayout
和layoutIfNeeded
那么有时候偶尔会想为什么需要调用setNeedsLayout
和layoutIfNeeded
这两个方法和layoutSubviews
之间又有什么联系呢?
layoutSubview
的作用是什么呢?
-
layoutSubview
的字面意思就是布局子控件。 - 需要首先需要明确的一点是系统的View并不会在
layoutSubview
方面里面实现某些代码,如果想要在layoutSubview
搞事情,必须要子类去重写该方法 - 当需要更新
subview
的frame的时候
layoutSubview
何时触发呢?
- 子视图首次被添加到父视图,子视图会触发
layoutSubviews
- 视图改变自身的size的时候,会触发
layoutSubviews
- 当视图添加subview的时候
- 第一次滑动UIScrollView的时候触发
layoutSubviews
。 - 旋转Screen会触发父UIView上的layoutSubviews事件。
- 手动调用
setNeedsLayout
- init的时候不会触发
layoutSubviews
其他
-
注意
- 有时候需要动画效果来刷新界面 分为通过frame或者是autolayout,如果是frame方式创建view并且 那么我们直接调用既可
[UIView animateWithDuration:5 animations:^{
self.testView.frame=CGRectMake(0, 0, 10, 111);
} completion:^(BOOL finished) {
}];
- 如果是通过autolayout布局,需要把约束写在
animateWithDuration
的前面,那样子才会执行动画效果。具体为什么,还不是很清楚
self.animationViewWIdth.constant=200;
self.animationViewWIdth.constant=100;
[UIView animateWithDuration:5 animations:^{
[self.animationView setNeedsLayout];
[self.animationView layoutIfNeeded];
} completion:^(BOOL finished) {
}];