所见即所得(上)——通过 XIB 自定义 UIView
Apr 6, 2022
所见即所得符合视觉动物的直觉。
源起
创建一个继承自 UIView 的类的时候,Xcode 是不会给你创建对应的 XIB 文件的(没有勾选框给你)。这个对于视觉性动物来说是说不过去的。
有意思的是,Xcode 是允许你单独创建一个 XIB 文件的。所以,是可以通过 XIB 自定义 UIView 的。这种所见即所得的快感当然是不容错过的。
步骤
具体的操作步骤比较简单,主要分为 4 步。这里创建一个名为 StarView 的类(只是用来展示星星符号的,意思意思就可以了,哈哈),话不多说,直接开干。
分别创建一个继承自 UIView 的类以及一个 XIB 文件(应该同名);
选中 XIB 文件,把 File’s Owner 设置为对应的类名;
选中 XIB 中的 View,并把 View connect 到类当中。
最后一步就是实现以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.contentView = [self loadViewFromNib];
[self addSubview:self.contentView];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
self.contentView = [self loadViewFromNib];
[self addSubview:self.contentView];
}
return self;
}
- (UIView *)loadViewFromNib {
UIView *theView = [[NSBundle mainBundle] loadNibNamed:@"StarView" owner:self options:nil][0];
theView.frame = self.bounds;
return theView;
}
解释
这里解析一下代码的意义。
代码里用到了 initWithFrame:
和 initWithCoder:
这 2 个初始化的方法。在外部创建一个 StarView 对象的时候,无论是代码创建还是拖动控件,都能够调用到 loadViewFromNib
这个方法。
一点修饰
既然这是一个 StarView,那么就应该有几个星星在里面。星星的形状很容易绘制,就是一个字符串 ★。
使用
在使用这个自定义类的时候,可以很简单地创建出来:
1 | StarView *starView = [[StarView alloc] initWithFrame:CGRectMake(20, 20, 300, 40)]; |
总结
很好,我喜欢这个方法,哈哈。