美文网首页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