美文网首页iOS Developer
xib自定义view的这点事

xib自定义view的这点事

作者: revon | 来源:发表于2016-11-22 17:06 被阅读117次

    我们知道创建一个集成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吧

    相关文章

      网友评论

        本文标题:xib自定义view的这点事

        本文链接:https://www.haomeiwen.com/subject/zkzppttx.html