最近想整理一下项目中下单支付的模块,然后想到用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
这个宏命令竟然没有什么作用了.
希望对大家哟帮助.