iOS自定义控件开发梳理总结

2020-01-18 17:13:17于海丽

init初始化不会触发layoutSubviews addSubview会触发layoutSubviews 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化 滚动一个UIScrollView会触发layoutSubviews 旋转Screen会触发父UIView上的layoutSubviews事件 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

这个自定义控件提供对外接口方法,为自定义的控件赋值


- (void)configeWithImage:(UIImage *)image {
 _imageView.image = image;
}

最后,添加自定义控件到页面上


 _circleImageView = [[CircleImageView alloc] initWithFrame:CGRectMake(0, 80, 150, 150)];
 [_circleImageView configeWithImage:[UIImage imageNamed:@"tree"]];
 [self.view addSubview:_circleImageView];

通过xib创建自定义控件
首先创建一个自定义控件XibCircleImageView,继承自UIViewios,自定义控件,自定义uiview,ios自定义控件开发
创建xib文件,与XibCircleImageView类同名ios,自定义控件,自定义uiview,ios自定义控件开发
配置xib中imageView的属性,并将XibCircleImageView 类与对应的xib文件进行绑定ios,自定义控件,自定义uiview,ios自定义控件开发
代码如下


- (void)awakeFromNib {
 [super awakeFromNib];

 _imageView.layer.masksToBounds = YES;
 _imageView.layer.cornerRadius = self.frame.size.width/2;
 // [self addSubview:_imageView];
}

- (void)configeWithImage:(UIImage *)image {
 _imageView.image = image;
}

-(void)layoutSubviews {
 [super layoutSubviews];
 _imageView.layer.cornerRadius = self.frame.size.width/2;

}

在页面中调用方式有点不同,通过loadNibNamed方法创建xib对象

 


 //使用xib创建自定义控件
 _xibCircleImageView = [[[NSBundle mainBundle] loadNibNamed:@"XibCircleImageView" owner:nil options:nil] lastObject];
 _xibCircleImageView.frame = CGRectMake(0, 500, 100, 100);
 [_xibCircleImageView configeWithImage:image];
 [self.view addSubview:_xibCircleImageView];

当使用xib创建自定义控件时,初始化不会调用initWithFrame:方法,只会调用initWithCoder:方法,初始化完毕后才调用awakeFromNib方法,注意要在awakeFromNib中初始化子控件。因为initWithCoder:方法表示对象是从文件解析来的,就会调用,而awakeFromNib方法是从xib或者storyboard加载完毕后才会调用。

小结

这两种创建自定义控件的方式各有优劣,纯代码方式比较灵活,维护和扩展都比较方便,但写起来比较麻烦。xib方式开发效率高,但不易扩展和维护,适合功能样式比较稳定的自定义控件。