纯代码/xib 自定义控件

1 纯代码的方式

  • 新建一个继承自UIView的类

  • 在init方法中添加子控件

  • 在layoutSubviews方法中设置子控件的frame(一定要调用[super layoutSubviews])

  • 提供一个模型属性,重写模型属性的set方法

  • 在set方法中,取出模型属性,给对应的子控件赋值


// 纯代码时,用init方法

- (instancetype)initWithFrame:(CGRect)frame

{

if (self = [super initWithFrame:frame]) {

// 添加图片

UIImageView *iconImageView = [[UIImageView alloc] init];

iconImageView.backgroundColor = [UIColor yellowColor];

[self addSubview:iconImageView];

self.iconImageView = iconImageView;

// 添加文字

UILabel *nameLabel = [[UILabel alloc] init];

nameLabel.backgroundColor = [UIColor purpleColor];

nameLabel.textAlignment = NSTextAlignmentCenter;

[self addSubview:nameLabel];

self.namelabel = nameLabel;

}

return self;

}

/**

*  布局子控件,设置子控件的frame

*/

- (void)layoutSubviews

{

// 这里一定要调用super

[super layoutSubviews];

CGFloat shopW = self.frame.size.width;

CGFloat shopH = self.frame.size.height;

self.iconImageView.frame = CGRectMake(0, 0, shopW, shopW);

self.namelabel.frame = CGRectMake(0, shopW, shopW, shopH - shopW);

}

/**

*  设置数据

*/

- (void)setShop:(XMGShop *)shop

{

_shop = shop;

self.iconImageView.image = [UIImage imageNamed:shop.icon];

self.namelabel.text = shop.name;

}

2 加载xib的方式


// 方式1:

NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil];

// 方式2:

UINib *nib = [UINib nibWithNibName:@"Test" bundle:nil]; // nil 默认是mainBundle

NSArray *array = [nib instantiteWithOwer:nil object:nil];

  • 通过xib自定义控件的步骤

  • 创建一个xib文件

  • 新建一个继承自UIView的类,管理该xib文件,xib的文件名最好与类名一致

  • 修改xib中父控件的class为控件类名

  • 将子控件进行连线

  • 在set方法中给子控件设置数据

  • 提供模型属性,重写模型的set方法

3 初始化方法

(1)凡是通过代码创建控件的时候,会调用方法- (instancetype)initWithFrame:(CGRect)frame


- (instancetype)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

NSLog(@"initWithFrame");

}

return self;

}

(2)凡是通过xib,stroyboard 创建控件的时候,就会调用方法- (instancetype)initWithCoder:(NSCoder *)coder


- (instancetype)initWithCoder:(NSCoder *)coder

{

self = [super initWithCoder:coder];

if (self) {

NSLog(@"initWithCoder");

//注意:在此方法中不能获得子控件

//        NSLog(@"%@", self.iconView);

}

return self;

}

(3)凡是通过xib,stroyboard 创建控件之后,就会调用方法- (void)awakeFromNib


- (void)awakeFromNib {

//在此方法中一定要调用[super awakeFromNib];

//可以在此方法中对子控件进行初始化操作

[super awakeFromNib];

NSLog(@"awakeFromNib");

NSLog(@"==%@", self.iconView);

}

你可能感兴趣的:(纯代码/xib 自定义控件)