在StoryBoard/Xib 中复用Xib 并实时预览

来源:互联网 发布:linux sshd服务是什么 编辑:程序博客网 时间:2024/06/06 02:37

最近想整理一下项目中下单支付的模块,然后想到用xib独立出来并在多个ViewController中来复用,

首先说一下自己对xib/StoryBoard 和 纯代码布局的看法.

一些人坚持用纯代码做布局,并且非常抗拒ib 甚至有鄙视后者的人,首先布局这个是没有多少技术含量在里面的,使用ib 能够大大的提升效率,并且在项目维护上比纯代码要直观的多,这里提一下安卓的布局与逻辑的分离,xml负责样式,.java负责逻辑,然后iOS的ib 本质上也是xml 与 安卓十分类似.

上面所说的就是表达一下自己的态度吧.

其实在百度中搜索StoryBoard复用xib 或者相互混用,能搜出很多,不过大部分并没有加入实时预览或者不是很完整,所以自己在照着别人做的情况下做了一些整合和改进,希望对大家有帮助,先上Demo的地址,后期添加功能的话也会在这里修改.

现在已经能做到在StoryBoard中添加并显示内部内容,做的比较简陋,

先上几个前辈的链接

链接1:这个是用Swift实现,如果改OC需要注意一些地方

链接2:这个对我影响比较大,但是其中的setFrame方法需要外部调用,感觉是不足,改进了下.

上一段认为比较核心的代码

- (instancetype)initWithCoder:(NSCoder *)coder {    self = [super initWithCoder:coder];    if (self) {        [self createView];    }    return self;}- (instancetype)initWithFrame:(CGRect)frame {    self = [super initWithFrame:frame];    if (self) {        [self createView];    }    return self;}- (void)setFrame:(CGRect)frame {    [super setFrame:frame];    self.view.frame = self.bounds;}- (void)createView {    self.view = [[NSBundle bundleForClass:[self class]] loadNibNamed:NSStringFromClass([self class])                                                               owner:self                                                             options:nil][0];    self.view.frame = self.bounds;    [self addSubview:self.view];}
按顺序说下这四个方法的作用,这些是经过验证的,当前开发环境 Xcode 8.3.2 + iOS 10.3.2

1. 加载自定义View时会调用这个方法,

2. 如果想在ib 中显示复用View的内容需要重写这个

3. 如果想在ib 中显示正确的frame(不写这个不会调用autolayout),需要重写这个

4. 会吧ib中的View 加载到父View上


在链接2中使用的方式是重写awakeFromNib,在这里添加View,但是在我这个开发环境下,调用awakeFromNib必须[super awaleFromNib],这样就会在当前ViewController的View上多显示一层 customView;


这样发现 

IB_DESIGNABLE

这个宏命令竟然没有什么作用了.

希望对大家哟帮助.