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



