xib自定义view的这点事

我们知道创建一个集成UIView的控件的时候,不能像viewcontroller那样有一个xib,但是又想用xib来布局这个view,这时候就要自定义一个view的xib文件了。
创建一个view的子类customView继承UIView
紧接着创建一个xib,选择

xib自定义view的这点事_第1张图片
view.png

下一步的save as名字可以随便取,建议取成和子类view相同的名字,这里我取得是customView
接下来,把这个view的class改为


xib自定义view的这点事_第2张图片
屏幕快照 2016-11-22 下午4.26.58.png

这样,你可以在上边愉快的拉控件来布局了,但是怎么用呢
在用的时候,可以这样

customView *customV = [[[NSBundle mainBundle] loadNibNamed:@"customView" owner:self options:nil] firstObject];

此时,在这个xib中,view的大小默认是屏幕的大小,如果你想用熟悉的initWithFrame,可以这样,在customView.m中,重写initWithFrame方法

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame: frame];
    if (self) {
        UIView *vi = [[[NSBundle mainBundle] loadNibNamed:@"customView" owner:self options:nil] firstObject];
        vi.frame = frame;
        [self addSubview:vi];
    }
    return self;
}

注意,这里如果你用了拉约束的方法,很多是没用的(设置水平中心和竖直中有用,也就是视图中心点跟父视图一样),这里你可以把约束拉出来成为一个属性,在你需要的时候,设置这个属性就行了。这算是也是一个弊端吧。
接下来,坑来了
如果你在这个xib的view上增加了一个viewOther,在这个viewOther上,你再拉控件,这时候,在viewOther上的控件约束有用了,你想说,这下就可以愉快的用约束了(前提是你的viewOther设置好了约束)。有一个问题,你将控件拉成属性,是在customView中,你给控件赋值是没问题的,如果你想设置圆角啊,边框啊这些属性,你如果在

- (instancetype)initWithCoder:(NSCoder *)aDecoder

里边写,是没有效果的,这个方法是走了的,但是就是没效果(原因就是这个方法是初始化costomView的,这个时候,viewOther上的控件,不确定是不是初始化好了)
有些同学可能会在xib中,用kvc的方式来改变,但是边框颜色是用不来这个的,解决方法很简单,代码如下

//customView的初始化方法里
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self layoutIfNeeded];
    }
    return self;
}

在这里

- (void)layoutSubviews {
    //coding what you wang to set
}

这样,你所有的子view上的控件就会有你想要的效果了。好了,愉快的自定义view吧

你可能感兴趣的:(xib自定义view的这点事)