所见即所得符合视觉动物的直觉。

源起

创建一个继承自 UIView 的类的时候,Xcode 是不会给你创建对应的 XIB 文件的(没有勾选框给你)。这个对于视觉性动物来说是说不过去的。

有意思的是,Xcode 是允许你单独创建一个 XIB 文件的。所以,是可以通过 XIB 自定义 UIView 的。这种所见即所得的快感当然是不容错过的。

步骤

具体的操作步骤比较简单,主要分为 4 步。这里创建一个名为 StarView 的类(只是用来展示星星符号的,意思意思就可以了,哈哈),话不多说,直接开干。

  1. 分别创建一个继承自 UIView 的类以及一个 XIB 文件(应该同名);

  2. 选中 XIB 文件,把 File’s Owner 设置为对应的类名;

  3. 选中 XIB 中的 View,并把 View connect 到类当中。

  4. 最后一步就是实现以下代码:

    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
2
StarView *starView = [[StarView alloc] initWithFrame:CGRectMake(20, 20, 300, 40)];
[self.view addSubview:starView];

总结

很好,我喜欢这个方法,哈哈。