美文网首页IOS开发路上的故事技术重塑iOS学习
用XIB自定义控件(在XIB中继承使用)

用XIB自定义控件(在XIB中继承使用)

作者: 门前有棵葡萄树 | 来源:发表于2016-12-01 13:14 被阅读495次
    • 前言
      做开发也有蛮长的时间了,记得刚入行的时候不管写什么都是纯代码,从来都不会用Xib拖一个控件,更别说什么storyboard了。后来发现身边的同事都在用XIB写界面,每次我费了半天写出来的界面他两个小时就搞完了,而且适配也很完美。慢慢的就开始试着使用XIB和storyboard了。
      用了XIB和storyboard一段时间后,发现人是越来越懒了,哪怕一个非常简单的界面控件啥的都不愿意多写一句代码了,直接XIB。但是遇到一个很尴尬的问题,就是用XIB去自定义一个视图时,在另外一个XIB上用的时候,单单继承是完全没有用的,最后还得用代码去创建。为此很是苦恼。
      后来参考了好多网上的资料搞定了。为了后学者节约时间,特发此文。

    Demo地址

    • 详细步骤如下
      1.创建一个即成UIView的类

    Paste_Image.png


    2.创建一个同名的XIB文件


    Paste_Image.png


    3.在XIB中自定义你的视图以及控件,将控件自定义成你想要的样子


    Paste_Image.png

    4.设置XIB的File's Owner 的Class为你创建的那个类


    Paste_Image.png


    5.将xib中的View拖拽关联成你创建的那个类的成员变量取名view


    Paste_Image.png


    6.在创建的类.m文件重写如下方法


    Paste_Image.png
    /**
     XIB创建会掉用
     */
    - (instancetype)initWithCoder:(NSCoder *)coder{
        self = [super initWithCoder:coder];
        if (self) {
            [self setUI];
        }
        return self;
    }
    
    /**
     代码创建会掉用
     */
    - (instancetype)initWithFrame:(CGRect)frame{
        self = [super initWithFrame:frame];
        if (self) {
            [self setUI];
        }
        return self;
    }
    
    /**
     初始化
     */
    - (void)setUI{
        [[NSBundle mainBundle]loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
        [self addSubview:self.view];
    }
    
    /**
     自动适配大小
     */
    - (void)drawRect:(CGRect)rect{
        self.view.frame = self.bounds;
    }

    7.使用
    XIB直接拖拽一个View然后即成你自定义的类就好了


    Paste_Image.png

    代码创建

    CustomXibView *view = [[CustomXibView alloc] initWithFrame:CGRectMake(0, 0, 300, 100)];

    相关文章

      网友评论

      • YungFan:setUI方法没理解第一句话执行后没有接收 第二句话 self 指的就是自定义的View,那self.view是什么?
        扛支枪:这个是咨询了《ios开发捷径》的作者郭晓亮老师
        扛支枪:那其实[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];的作用是指定xib的owner是self,然后是从nib文件中加载了xib文件,那么xib对应的view就有值了,即self.view.然后通过[self addSubview:self.view]就实现了嵌套。最好理解的方式其实是这样的,删除xib添加的IBOutlet view,然后setUI替换成这个代码即可:UIView *vi = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] firstObject];
        vi.frame = self.bounds;
        [self addSubview:vi];
        门前有棵葡萄树:[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]
        里面有个owner:self 接收者就是 self.view了
      • 0563b5c3165f:这个的目的是不是为了在复用xib的时候不用代码去写一遍吗?
        门前有棵葡萄树:@思念那年慕云 就是 你在xib中 拖一个 UIView 直接把这个 view的类 改成 你自定义的类 就可以用了
        思念那年慕云: @门前有棵葡萄树 这句话的继承是什么意思?
        门前有棵葡萄树:@猫咪瞎跳 还有个就是,可以直接在XIB中拖一个view继承就好了,不用写代码了

      本文标题:用XIB自定义控件(在XIB中继承使用)

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