使用代码自定义视图的时候的注意事项:
1.要重写UIView的initWithFrame:方法而不是init方法;
理由:当外部调用init方法的时候,其内部也会默默地调用initWithFrame:方法。我们不能保证别的人在调用我们的类的时候不会直接调用initWithFrame:方法,这时如果仅重写了init方法,那么它的子空件便无法创建。
2.如果我们在创建子控件的时候,切忌如下
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
UIImageView* imageView = [[UIImageView alloc]init];
[self addSubview:imageView];
imageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}
return self;
}
理由:问题主要出现在imageView的frame赋值的地方。imageView的宽和高是直接用的self.frame.size.width,但在这个时候self.frame是可能没有值的。视图的init方法,也会执行到这里,这时候frame还没有赋值
3.不要在构造方法里面直接取本身(self或者说是本视图)的宽高,这时候取到的宽高时不准的
所以在重新构造方法的时候,我们只需要把控件放进去,暂时不要考虑它们的位置,如下
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
UIImageView* imageView = [[UIImageView alloc]init];
[self addSubview:imageView];
}
return self;
}
最典型的例子就是:在我们自定义tableViewCell的时候。重写cell的初始化方法向cell添加控件时,如label.frame = CGRectMake(0,self.frame.size.height - 20, 100, 20),我们会发现实际的y值是44-20,而不是我们设置的cell的高度-20
3.在layoutSubviews方法里面布局子控件,但是一定要先调用其父类如下
-(void)layoutSubviews{
[super layoutSubviews];
imageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}
4,另外我们也可以在构造方法之外创建子控件,声明为属性,使用懒加载,重写其get方法也是不错的