视图-②生命周期

目录

五、控制器View的生命周期

< 返回目录

更详细的生命周期请查看:iOS程序执行顺序和UIViewController 的生命周期(整理)

题目1:控制器View的生命周期及相关函数是什么?你在开发中是如何用的?
1
2
3
4
1.在视图显示之前调用viewWillAppear;该函数可以调用多次; 
2.视图显示完毕,调用viewDidAppear;
3.在视图消失之前调用viewWillDisAppear;该函数可以调用多次(如需要);
4.在布局变化前后,调用viewWill/DidLayoutSubviews处理相关信息;

viewWillAppear——-》viewWillLayoutSubviews—–》viewDidLayoutSubviews———–》

viewDidAppear

题目2:loadView, viewDidLoad, viewDidUnLoad,分别是在什么时候被调用的.

loadView, viewDidLoad, viewDidUnLoad,分别是在什么时候被调用的.

3、layoutSubviews布局与drawRect重绘

(1)、layoutSubviews布局

layoutSubviews是对subviews重新布局;
比如,我们想更新子视图的位置的时候,可以通过调用layoutSubviews方法,即可以实现对子视图重新布局。但实际上一般我们都是不要直接手动调用layoutSubviews方法。因为有操作时候,系统会自动调用layoutSubviews。

那我们进行哪些操作会触发layoutSubviews方法呢?答如下:

1
2
3
4
5
6
7
8
9
首先注意:
①init初始化不会触发layoutSubviews,
但是使用initWithFrame进行初始化时,当rect的值不为CGRectZero时,会触发layoutSubviews。
②、直接调用setLayoutSubviews。
③、addSubview的时候一般都会触发layoutSubviews。(最常见) 注:但当本View的frame为0时,addSubView也不会调用layoutSubViews。
④、当view的frame发生改变的时候触发layoutSubviews。
⑤、滑动UIScrollView的时候触发layoutSubviews。
⑥、旋转Screen会触发父UIView上的layoutSubviews事件。
⑦、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。

所以我们可以看出当视图约束/frame变化时候,会触发layoutSubviews,进行重新布局。

1
2
3
4
5
6
7
8
9
10
附:
如果你还是想强制更新布局,你可以调用setNeedsLayout方法;
如果你想立即显示你的views,你需要调用layoutIfNeed方法。

①、- (void)layoutSubviews;
这个方法,默认没有做任何事情,需要子类进行重写;
②、- (void)setNeedsLayout;
标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用;
③、- (void)layoutIfNeeded;
如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)。

其他参考文章:iOS layoutSubview的方法总结/重绘drawRect

什么时候用layoutSubviews?

答:仅仅在以下情况下:自动布局达不到想要效果时你才有必要重写这个方法.可以直接设置subviews的尺寸.

(2)、drawRect重绘

重绘作用:重写该方法以实现自定义的绘制内容

1
2
3
-drawRect:(CGRect)rect方法:重写此方法,执行重绘任务
-setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘
(3)、updateConstraints更新约束、layoutSubviews重新布局与drawRect重绘的调用顺序
1
2
3
layoutSubviews是对subviews重新布局;
drawRect重绘;
layoutSubviews方法调用先于drawRect,也就是先布局子视图,在重绘。

所以,在调用updateConstraintsIfNeeded可能会立即执行updateConstraints,然后调用layoutSubviews。因为按照Autolayout布局的步骤,应该是先更新约束然后更新布局的。

常见笔试/面试题

< 返回目录

END

< 返回目录