自定义视图介绍
自定义视图创建有两种方式。
纯代码方式编写,适合通用控件、组件、三方库等编写。
xib 方式编写,适合非通用、项目特有的、相对复杂的视图。方便快捷。
有两个关键宏添加在自定义视图中有一下效果:
IB_DESIGNABLE 让你的自定 UIView 可以在 IB 中预览。(头文件类声明之前)
IBInspectable 让你的自定义 UIView 的属性出现在 IB 中 Attributes inspector。(头文件属性中)
IB_DESIGNABLE
@interface TestView : UIView
@property (assign, nonatomic) IBInspectable CGFloat cornerRadius;
@end
通过xib创建非通用类型的自定义 view
首先,创建自定义view及其同名xib视图
其次,设置xib的file’owner为该自定义视图,设置xib为*视图(注意:不要设置xib类型)
然后,重写initWithCoder和initWithFrame如下:
#import "TestView.h"
@interface TestView ()
@property (weak, nonatomic) UIView *selfView;
@end
@implementation TestView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self commonInit];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
[self commonInit];
}
return self;
}
- (void)commonInit {
NSArray *views = [[NSBundle bundleForClass:[self class]] loadNibNamed:@"TestView" owner:self options:nil];
_selfView = views.firstObject;
[self addSubview:_selfView];
}
- (void)layoutSubviews {
_selfView.frame = self.bounds;
}
@end
获取
NSArray *views = [[NSBundle bundleForClass:[self class]] loadNibNamed:@"HelloView" owner:self options:nil];
必须设置 bundle 为
[NSBundle bundleForClass:[self class]]
才能在使用 IB_DESIGNABLE 时正确编译。如果将bundle设置为 nil 或者 main 都不行,这样会导致编译器报错。