iOS-代码自定义视图的心得

使用代码自定义视图的时候的注意事项:

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方法也是不错的

你可能感兴趣的:(iOS-代码自定义视图的心得)