一、使用纯代码的方式
1、一般来说我们的自定义类继承自
UIView
,首先在initWithFrame:
方法中将需要的子控件加入view中。注意,这里只是加入到view中,并没有设置各个子控件的尺寸。
为什么要在initWithFrame:
方法而不是在init
方法?
因为使用纯代码的方式创建自定义类,在以后使用的时候可能使用init
方法创建,也有可能使用initWithFrame:
方法创建,但是无论哪种方式,最后都会调用到initWithFrame:
方法。在这个方法中创建子控件,可以保证无论哪种方式都可以成功创建。
为什么要在initWithFrame:
方法里面只是将子控件加到view而不设置尺寸?
前面已经说过,两种方式最后都会调用到initWithFrame:
方法。如果使用init方法创建,那么这个view的frame有可能是不确定的。
2、在
layoutSubviews
方法中访问子控件,设置子控件的尺寸,因为此时view的frame已经确定。
二、使用xib的方式
用xib这种方式是需要加载xib文件的。加载xib文件有两种方法:
// 第一种方法(较为常用)
CYLView *view = [[[NSBundle mainBundle] loadNibNamed:@"CYLView" owner:nil options:nil] firstObject];
// 第二种方法
UINib *nib = [UINib nibWithNibName:@"CYLView" bundle:nil];
NSArray *objectArray = [nib instantiateWithOwner:nil options:nil];
CYLView *view = [objectArray firstObject];
三、补充
1、如果使用代码的方式创建控件,那么在创建时一定会调用initWithFrame:
方法;如果使用xib/storyboard
方式创建控件,那么在创建时一定会调用initWithCoder:
方法,初始化完成后一定会调用awakeFromNib
方法。
2、无论是通过代码的方式,还是通过xib的方式,都会初始化一些值,那么我们可以将初始化的代码抽到一个方法里面,然后在initWithFrame:
方法和awakeFromNib
方法中分别调用这个方法。