自定义控件之xib方式
-
xib与storyboard
- 共同点:
- 都用来描述软件界面
- 都用Interface Builder工具来编辑
- 本质都是转换成代码去创建控件
- 不同点:
- Xib是轻量级的,用来描述局部的UI界面
- Storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系
- 共同点:
-
Xib的加载方式
- 方式一:通过
mainBundel
loadNibNamed
加载
- 方式一:通过
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"xib文件名" owner:nil options:nil];
- 方式二:通过 `UINib` `nibWithNibName` 加载
UINib *nib = [UINib nibWithNibName:@"xib文件名" bundle:nil];
NSArray *views = [nib instantiateWithOwner:nil options:nil];
- **通过 Xib 创建自定义控件步骤:**
- 新建一个继承 `UIView` 的类
- 新建一个 Xib 文件(xib的文件名最好和控件类名一样)
- 添加子控件、设置子控件属性
- 修改 Xib 文件的 class 为控件类名
- 将子控件进行连线
- **UIView方法说明**
- `init` 和 `initWithFrame` 一般在使用代码创建的时候调用,调用 `init` 的时候,系统会默认调用一次 `initWithFrame` ;但调用 `initWithFrame` 不会调用 `init`;所以一般初始化自己的子控件一般都是放在 `initWithFrame`
代码
//重写-(instancetype)initWithFrame:(CGRect)frame方法
//init方法内部会自动调用-(instancetype)initWithFrame:(CGRect)frame 方法,因此建议写这个方法,用于替代-(instancetype)init 方法
-(instancetype)initWithFrame:(CGRect)frame {
if (self = [super init]) {
//这里初始化控件
}
return self;
}
- `layoutSubviews`这个方法方法专门用来布局子控件,一般在这里设置子控件的frame,当控件本身的尺寸发生改变的时候,系统会自动调用这个方法。重写此方法内一定要调用 `[super layoutSubviews]`
代码
/**
* 这个方法专门用来布局子控件,一般在这里设置子控件的frame
* 当控件本身的尺寸发生改变的时候,系统会自动调用这个方
*/
-(void)layoutSubviews {
// 一定要调用super方法
[super layoutSubviews];
//这里设置子控件的frame
}
- `initWithcoder` 使用 storyboard/xib 中加载就会调用这个方法;这个方法一般是初始化的操作
- `awakeFromNib` storyboard/xib中加载完毕的时候调用,想做一些在xib加载完毕的操作,就在这个方法中操作(建议在这个方法中写初始化代码)
网友评论