我们知道创建一个集成UIView的控件的时候,不能像viewcontroller那样有一个xib,但是又想用xib来布局这个view,这时候就要自定义一个view的xib文件了。
创建一个view的子类customView继承UIView
紧接着创建一个xib,选择
下一步的save as名字可以随便取,建议取成和子类view相同的名字,这里我取得是customView
接下来,把这个view的class改为
屏幕快照 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吧
网友评论