当用纯代码调用init方法创建对象时,会调用initWithFrame方法,再调用init方法。
为什么要在initWithFrame:方法而不是在init方法?
因为使用纯代码的方式创建自定义类,在以后使用的时候可能使用init方法创建,也有可能使用initWithFrame:方法创建,但是无论哪种方式,最后都会调用到initWithFrame:方法。在这个方法中创建子控件,可以保证无论哪种方式都可以成功创建。
这里有一点需要特别注意:
千万不能像下面这样自定义类,否则,如果你使用init方法初始化,那么,因为setUI方法会被调用两次,所以会加入两次UI控件。
- (instancetype)init
{
self = [super init];
if (self) {
[self setUI]; //
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setUI];//
}
return self;
}
- (void)setUI
{
UILabel* titleLabel = ({
UILabel* label = [[UILabel alloc]init];
label.text = @"风速";
label.textColor = [UIColor whiteColor];
label.font = [UIFont systemFontOfSize:16];
[self addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.mas_equalTo(10);
}];
label;
});
_titleLabel = titleLabel;
UIView* lineView = ({
UIView* view = [[UIView alloc]init];
view.backgroundColor = [UIColor whiteColor];
[self addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(1);
make.left.mas_equalTo(10);
make.right.equalTo(self.mas_right).offset(-10);
make.centerY.equalTo(titleLabel.mas_bottom).offset(0);
// make.bottom.equalTo(titleLabel.mas_bottom).offset(1);
}];
view;
});
}
网友评论