xib自定义view的这点事

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

view.png

下一步的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吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,764评论 25 709
  • 掌握 UIView的常见属性和方法 九宫格计算方法 字典转模型 Xib的使用 自定义view(view的封装) 简...
    JonesCxy阅读 5,227评论 1 3
  • 文章引自http://www.jianshu.com/p/7e47da62899c,感谢作者贡献的文章。 1.使用...
    DDB_CS阅读 9,756评论 1 4
  • 这个计划是在哪个时候由哪个人提议,@NanoApe 已经忘记得差不多了他只记得,在他的 Todo List 里,有...
    Konano阅读 3,547评论 0 0
  • 消息来源 Purdue 大学研究发现脂肪是人类的第六种味道,这种味觉 产生了一个新词汇 oleogustus。特聘...
    jieroarchl阅读 3,940评论 0 1