一、通過代碼來自定義控件
繼承自系統自帶的控件,寫一個屬于自己的控件
目的:封裝控件內部的細節,不讓外界關心
-
步驟
- 1、新建一個繼承
UIView
的類
新建的類 - 2、在
initWithFrame:
方法中添加子控件
initWithFrame: - 3、在
layoutSubviews
方法中設置子控件的frame- 一定要調用
[super layoutSubviews]
方法;
layoutSubviews
- 一定要調用
- 4、在新建的類中提供一個模型屬性,并重寫模型屬性的set方法
-
在set方法中取出模型屬性,給對應的子控件賦值
setter
-
- 1、新建一個繼承
-
注意點:
- init方法:初始化方法
- 與initWithFrame:方法:初始化方法,執行此方法時調用一次init方法,所以最好在這個方法里面添加子控件(xib自定義控件不會調用這個方法)
總結:
-
外界需要做得事情:
- 1、創建控件(自定義的控件);
- 2、設置控件的frame;
- 3、將控件添加到父控件上(一般是控制器的view);
- 4、給控件傳遞模型數據;
-
內部需要做得事情:
- 1、提供initWithFrame:方法來添加子控件;
- 2、提供layoutSubviews方法來添加子控件;
- 3、重寫set方法(在這里為子控件設置數據);
二、通過xib文件來自定義控件
- 新建一個繼承
UIView
的類 - 新建一個xib文件(xib的文件名最好跟控件類名一樣)
- 添加子控件、設置子控件屬性
- 修改最外面那個控件的class為控件類名
- 將子控件進行連線
- 在新建的類里面加載xib文件:
- 方法一:
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil]
- 方法二:
[UINib nibWithNibName:NSStringFromClass(self) bundle:nil];
-
提供模型屬性,重寫模型的set方法
- 在set方法中給子控件設置數據
-
注意
- 1、通過xib文件來自定義控件是,不會調用
init
,initWithFrame:
方法; - 2、幾個方法的調用順序:
- 1、通過xib文件來自定義控件是,不會調用
//第一:正在準備初始化
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
NSLog(@"initWithCoder");
}
return self;
}
//第二:初始化完畢`(若想初始化時做點事情,最好在這個方法里面實現)`
-(void)awakeFromNib
{
NSLog(@"awakeFromNib");
}
//第三:加載xib文件
XMGShopView *shopView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];