有时候我们在开发或者是看其他人编写的组件的时候 经常会看到子类重写了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
其他
-
注意
image.png - 有时候需要动画效果来刷新界面 分为通过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) {
}];
