ios中的view生命周期

一. 控制器中的View生命周期:

View的生命周期


二. 控制器中的View加载过程:


View加载过程

View创建:loadView

1.从Storyboard/Xib加载视图时会调用的方法:

1).initWithCoder

2).awakeFromNib: 此时frameh还没有完成。

2.手写代码:

1.initWithCoder


initWithFrame,创建时init会调用此方法。不过此时frame为0,除非显示调用此方法,frame才会有值。

view采用懒加载的方式,只有用到view时才会被创建,即才会被调用loadView->viewDidLoad这一系列函数,控制器的View是延迟加载的: 创建控制器并不一定会创建控制器的view,等用到时再加载。

View加载:ViewDidLoad

加载到内存完成后会调用此函数,在视图切换中,只要控制器不从内存中移除此方法就不会被调用。一般在此方法中添加一些子控件,设置视图的初始属性等等,类似初始化。

View即将显示:ViewWillAppear

即将加载到窗口时调用此方法。一般在此方法做一些较为耗时的。这样就可以先显示基本的视图,呈现给用户(让用户感觉不是那么卡),然后再显示比较耗时的。以免显示一个白屏给用户。

View即将进行子控件布局:ViewWillLayoutSubViews

即将进行View的子控件进行布局,如果有多个子控件,子控件的布局方式采用从顶层到底层的树状布局。

View完成子控件布局:ViewDidLayoutSubViews

完成View的子控件进行布局。

View完全显示:ViewDidAppear

视图已经加载到窗口,已经完全显示。

View完成子控件布局:ViewWillDisappear

视图即将消失,被覆盖或者隐藏时调用。

View完成子控件布局:ViewDidDisappear

视图已经消失,被覆盖或者隐藏时调用。


三. View的布局:

UIView提供了layoutSubViews方法来处理。

需要注意的时layoutSubViews方法由系统来调用,不能程序员来调用。可以调用setNeedsLayout方法进行标记,以保证在UI下个刷屏系统中会调用layoutSubviews。或者layoutIfNedded直接请求系统调用layoutIfNeeded直接请求系统调用layoutSubviews。

layoutSubViews的被调用时机:

1.addSubView会触发layoutSubviews,比如ivewA add ViewB,第一次添加A和B的layoutSubviews都会被调用,而第二次( viewA 已经有了viewB)只调用viewB的。

2.view的frame改变会触发layoutSubViews。

3.滚动一个UIScrollView会触发layoutSubviews。

4.旋转Screen会触发UIView的layoutSubviews。

5.改变transform属性时,当然frame也会变。

6.处于key window的UIView才会被调用( 程序同一时间只有一个window为keyWindow,可以简单理解为显示在最前面的window的keywindow)

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 131,501评论 19 558
  • 翻译自“Collection View Programming Guide for iOS” 0 关于iOS集合视...
    lakerszhy阅读 2,014评论 1 18
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 32,335评论 21 586
  • 1. 不在夜深人静的晚上做重要决定,因为第二天我发现当时的决定是那么轻率、可笑; 2. 觉得自己文采不行,就强迫自...
    静海潜蛟阅读 44评论 0 0
  • 摘要:Lua作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来设计的,因此她一直遵从着简单、小巧、可移植、...
    Masukio阅读 31,266评论 5 35