虽然很多人仍然排斥storyboard(xib)这个东西,他们觉得容易引起冲突,不利于后期的维护,这些问题确确实实存在,但是你也不能否认它的强大的之处,可视化编辑是代码不能达到的,设置约束也是手到擒来,效率将会大大提高,在使用中,它往往还会给你带来一些惊喜,让你慢慢喜欢上这个东西。
话不多说,那我就总结一下我使用xib与tableview时的一些比较有用的东西
xib给tableview添加delegate和datasource
- 最简单的就是我们我们可以直接拖tableview的delegate和DataSource(是按住ctrl按住鼠标拖到下图一的File's Owner,放开鼠标,然后就会出现图二的两个选项,这时候选择delegate和DataSource就ok了,是不是很简单)
)
- 有些时候我们的tableview需要添加tableHeaderView,可能我们会去新建一个view,然后用代码把这个view设置为tableView的
Xib中的tableview添加headerView
tableHeaderView。但是现在我们可以用Xib直接拖一个tableHeaderView,我当时知道这个功能的时候感觉是发现了新大陆,对xib的好感又提升了不少,哈哈哈。
1.第一步:(如图三)直接拖一个view和xib是平级关系,注意看,view是和控制器单独存在的
2.第二步:(如图四)将view的size设为freeform(一定不能忘记这个最最最重要的操作!)
3.最后一步:(如图五)直接将你刚才的那个view用鼠标按住,使劲地拖,拖到tableview的下面去,像图上面的那种位置关系,这时你觉得你就成功了吗?那我告诉你,确实成功了,哈哈哈, 这时候这个view就是你的tableview的tableheaderView了,这时候你就可以随心所欲在上面添加控件了
4.最后的效果就是下面的了,红色的就是tableview的tableHeaderView。(你是不是发现我的这个控制器比你的长,哈哈。把你的控制器的size设置为Freeform,参照第二步,这样你就想拖多长就拖多长,tableHeaderView也可以想拖多长就拖多长,这样妈妈就再也不用担心控件过多,一个屏幕摆放不完的问题了)
storyboard中的tableview添加headerView
如果你觉得这种做法很麻烦,那我推荐你使用storyboard,这个玩意儿更方便,(只需参照第三步,图五),直接拖一个View放在上面,一步到位,简直so easy(效果就是下面那样,白色的就是tableHeaderView,也是随意在上面放控件就行了)。
Xib(storyboard)tableViewHeaderView 高度自适应
但是,当我使用这种方法的时候,发现高度不能自适应!!!!当hederView的高度是固定的时候没问题,但是当headerView的高度需要根据数据源来动态改变的时候,布局就会出现问题,无论约束怎么设置,然后也想到配合代码来自适应,但是都是失败了。我就觉得肯定是Xib的HeaderView不能自适应高度,当我想要放弃这个东西的时候,却意外发现了一个方法,完美解决烦恼。只需几行代码。
代码
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
//利用systemLayoutSizeFittingSize:计算出真实高度
CGFloat height = [self.tableView.tableHeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = self.tableView.tableHeaderView.frame;
headerFrame.size.height = height;
//修改tableHeaderView的frame
self.tableView.tableHeaderView.frame = headerFrame;
}
xib(storyboard)增加额外属性
有时我们在使用Xib的时候,发现属性不够用,这时我们一般的做法就是把这个控件拖成属性,然后在用代码去手懂设置属性,以前我也是这样做的。后面发现这种做法实在繁琐,就去网上看了找,最后发现常用的有两种办法,一种是利用runtime来做,就是下图中,在箭头所指的里面添加属性
但是我用的是另一种方法,就是通过category来增加属性,因为我觉得这种写法很方便,至于方便在哪里,后面为你揭晓答案
- 第一步,新建一个Uiview的Category,如下图
-
第二步,在新建类的.h文件内申明你要添加的属性(注意写法)
- 第三步, 在.m文件内重写属性的set方法,如下图
最后大功告成 ,你会发现Xib(storyboard)里面所有继承于UIView的类都会增加你手动添加的那些属性(如下图),有没感觉一劳永逸,十分强大。
代码:
.h文件
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
.m文件
@dynamic borderColor,borderWidth,cornerRadius;
-(void)setBorderColor:(UIColor *)borderColor{
[self.layer setBorderColor:borderColor.CGColor];
}
-(void)setBorderWidth:(CGFloat)borderWidth{
[self.layer setBorderWidth:borderWidth];
}
-(void)setCornerRadius:(CGFloat)cornerRadius{
[self.layer setCornerRadius:cornerRadius];
self.layer.masksToBounds = YES;
}
tableviewCell 自适应高度
有时候我们在用xib拖tableviewCell得时候,可能会有动态改变cell高度的时候,比如说遇到文本过多,需要换行,这时候的cell的高度就不是固定的了。然而,一般解决这个问题的步骤也不难,就是挨个去计算需要换行的label的高度,最后得到总高度,再在tableview的代理方法里面去返回这个高度。但是如果你用xib,那就是洒洒水,小意思啦。
直接上代码
//预估高度(必须要有)
self.tableview.estimatedRowHeight = 100;
// 设置cell自适应高度
self.tableview.rowHeight = UITableViewAutomaticDimension;
// 有了上面两件代码后,并保障storyboard中约束正确(必须保证cell中最上边的约束和最下边视图的约束都有