iOS 视图生命周期
2018-02-24 本文已影响68人
iOS_肖晨
控制器
控制器生命周期简介:
- init-初始化程序
- loadView-从nib载入视图
- viewDidLoad-加载视图
- viewWillAppear-即将出现
- viewWillLayoutSubviews-即将加载子视图
- viewDidLayoutSubviews-已经加载子视图
- viewDidApper-已经出现
- viewWillDisappear-即将消失
- viewDidDisappear-已经消失
- viewWillUnload-即将释放
- viewDidUnload-已经释放
布局
我们能看到手机上的视图都是UIView还有它的子UIView,当然不能杂乱无章的显示。要进行布局,父UIView需要布局、排列这些子UIView。UIView提供了layoutSubviews
方法来处理。
一般情况视图方法layoutSubviews
调用顺序为:
viewDidLayoutSubviews (控制器)
layoutSubviews
drawRect:
viewDidApper (控制器)
需要注意的是layoutSubviews
方法由系统来调用,不能程序员来手动调用。可以用以下两个手动方法调用:
setNeedsLayout
方法进行标记,在UI下个刷屏循环中系统会调用layoutSubviews。layoutIfNeeded
直接请求系统调用layoutSubviews。
layoutSubviews
的自动被调用的时机:
addSubview
会触发layoutSubviews
,比如viewA add viewB,第一次添加A和B的layoutSubviews都会被调用,而第二次(viewA已经有了viewB)只调用viewB的- view的Frame变化
- 滚动UIScrollView会触发
layoutSubviews
- 旋转Screen会触发父UIView上的
layoutSubviews
- 改变transform属性时,当然frame也会变
- 处于key window的UIView才会调用(程序同一时间只有一个window为keyWindow,可以简单理解为显示在最前面的window为keywindow)
另:关于 sizeToFit
需要注意如下:
- sizeToFit会自动调用sizeThatFits方法。
- sizeToFit不应该在子类中被重写,应该重写sizeThatFits。
- sizeThatFits传入的参数是receiver当前的size,返回一个适合的size。
- sizeToFit可以被手动直接调用。
- sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己。