自定义View
- 通常当一个view内部的子控件比较多,我们一般会考虑自定义一个view,在它的内部将子控件的创建屏蔽起来,这样外界就不用关心具体如何实现,只要导入这个类的.h文件使用就好了
- 注意一个控件有2种创建方式:
通过代码创建:
- 初始化时一定会调用initWithFrame:方法
通过xib\storyboard创建:
- 初始化时不会调用initWithFrame:方法,只会调用initWithCoder:方法
- 并且在初始化完毕后会调用awakeFromNib方法
- 在initWithFrame:方法中添加子控件
// 1.初始化子控件
-(instancetype)initWithFrame:(CGRect)frame//通过代码创建View时,init会默认调用initWithFrame方法
{
if (self = [super initWithFrame:frame]) {
// 1.初始化一个UIImageView对象
UIImageView *iconView = [[UIImageView alloc] init];
[self addSubview:iconView];
self.iconView = iconView;
// 2.初始化一个UIlabel对象
UILabel *titleLabel = [[UILabel alloc] init];
titleLabel.textAlignment = NSTextAlignmentCenter;
[self addSubview:titleLabel];
self.titleLabel = titleLabel;
}return self;
}
- 在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)
//2.调整子控件的位置和尺寸
-(void)layoutSubviews
{
// 1.调用父类的layoutSubviews(重要)
[super layoutSubviews];
// 2.取出当前控件的宽度和高度
CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height;
// 3.调整子控件的位置和尺寸
// 3.1.调整iconView的位置和尺寸
self.iconView.frame = CGRectMake(0, 0, width, width);
// 3.2.调整titleLabel的位置和尺寸
self.titleLabel.frame = CGRectMake(0, width, width, height - width);
}