UIView的layoutSubviews和drawRect方法什么时候调用 http://blog.sina.com.cn/s/blog_afb4d07f0101iamg.htmlhtml
loadView和viewDidLoad是iPhone开发中确定要用到的俩个方法,他们均可以用来在试图载入的时候初始化一些内容,可是他们有什么区别呢?安全
我在Xcode7.3.1上试验,无论是从xib建立views仍是代码建立views,这俩个方法都会走,并且是先走前者,再走后者。ui
建立一个类和实例化一个类.在XCode中建立一个类和实例化一个类很容易区分,可是在IB(Interface Builder)中有时候就会迷糊.其实也很好区分,孤零零地建立了一个nib文件,没有和其余可被实例化的类有直接或间接关系的时候,这个类或这些类(一个nib文件俺也可能包含多个类)是没有机会被实例化的,因此这种状况只是经过ib建立了一个类,而没有实例化.真正的实例化还须要经过在Xcode用代码来读取这个nib文件.知道这两这的区别后这些方法也就容易辨认多了spa
viewDidLoad其实没什么可混淆的,不管经过什么途径加载(Xcode或者IB,这里的加载属于实例化)完view后确定会执行这个方法.code
loadView须要分两种状况.当你经过Xcode实例化一个类的时候就须要本身在controller中实现这个方法.而在IB中实例化就不须要实现它.但若是你实现它,它也会调用,并且是在viewDidLoad以前,固然在它的实现里能够什么都不作。htm
initWithFrame、initWithCoder、awakeFromNib、drawRect这几个方法在自定义控件的时候,会常常调用,具体什么状况下会调用哪一个方法下面总结blog
-(id)initWithFrame:当控件不是从xib、storyboard中建立时,会调用这个方法开发
-(id)initWithCoder:当控件是从从xib、storyboard中建立时,会调用这个方法get
-(void)awakeFromNib这个方法在-(id)initWithCoder:方法后调用it
能够理解为:通过-(id)initWithCoder:建立出来的控件是死的,而后经过awakeFromNib来唤醒,因此会有一个前后的调用顺序。
这3个方法都须要调用[super ],调用其父视图的对应方法
通常来讲,为了安全起见,初始化控件的代码咱们写在一个方法里面,而后咱们分别在initWithFrame和initWithCoder中都调用一下,这样就保证了不管你是经过什么方式建立的控件,代码都能起做用。
-(void)drawRect:方法不论用代码建立实例仍是xib建立,若是实现了都会调用到的。调用顺序经实验是:
/* xib建立实例 13:23:10.005 UIView9.26[20419:10042299] -[MyView initWithCoder:] 13:23:10.007 UIView9.26[20419:10042299] -[MyView awakeFromNib] 13:23:10.007 UIView9.26[20419:10042299] -[ViewController viewDidLoad] 13:23:10.014 UIView9.26[20419:10042299] -[MyView drawRect:] */ /* 代码建立实例 13:26:58.854 UIView9.26[20432:10043790] -[ViewController viewDidLoad] 13:26:58.855 UIView9.26[20432:10043790] -[MyView initWithFrame:] 13:26:58.861 UIView9.26[20432:10043790] -[MyView drawRect:] */