iOS 当tableView 遇到Xib(storyBoard)自适应高度

虽然很多人仍然排斥storyboard(xib)这个东西,他们觉得容易引起冲突,不利于后期的维护,这些问题确确实实存在,但是你也不能否认它的强大的之处,可视化编辑是代码不能达到的,设置约束也是手到擒来,效率将会大大提高,在使用中,它往往还会给你带来一些惊喜,让你慢慢喜欢上这个东西。

话不多说,那我就总结一下我使用xib与tableview时的一些比较有用的东西

xib给tableview添加delegate和datasource

  • 最简单的就是我们我们可以直接拖tableview的delegate和DataSource(是按住ctrl按住鼠标拖到下图一的File's Owner,放开鼠标,然后就会出现图二的两个选项,这时候选择delegate和DataSource就ok了,是不是很简单)
iOS 当tableView 遇到Xib(storyBoard)自适应高度_第1张图片
图一.png

iOS 当tableView 遇到Xib(storyBoard)自适应高度_第2张图片
图二.png
  • 有些时候我们的tableview需要添加tableHeaderView,可能我们会去新建一个view,然后用代码把这个view设置为tableView的

Xib中的tableview添加headerView

tableHeaderView。但是现在我们可以用Xib直接拖一个tableHeaderView,我当时知道这个功能的时候感觉是发现了新大陆,对xib的好感又提升了不少,哈哈哈。
1.第一步:(如图三)直接拖一个view和xib是平级关系,注意看,view是和控制器单独存在的


iOS 当tableView 遇到Xib(storyBoard)自适应高度_第3张图片
图三.png

2.第二步:(如图四)将view的size设为freeform(一定不能忘记这个最最最重要的操作!)


iOS 当tableView 遇到Xib(storyBoard)自适应高度_第4张图片
图四.png

3.最后一步:(如图五)直接将你刚才的那个view用鼠标按住,使劲地拖,拖到tableview的下面去,像图上面的那种位置关系,这时你觉得你就成功了吗?那我告诉你,确实成功了,哈哈哈, 这时候这个view就是你的tableview的tableheaderView了,这时候你就可以随心所欲在上面添加控件了
iOS 当tableView 遇到Xib(storyBoard)自适应高度_第5张图片
图5.png

4.最后的效果就是下面的了,红色的就是tableview的tableHeaderView。(你是不是发现我的这个控制器比你的长,哈哈。把你的控制器的size设置为Freeform,参照第二步,这样你就想拖多长就拖多长,tableHeaderView也可以想拖多长就拖多长,这样妈妈就再也不用担心控件过多,一个屏幕摆放不完的问题了)
iOS 当tableView 遇到Xib(storyBoard)自适应高度_第6张图片
图六.png

storyboard中的tableview添加headerView

如果你觉得这种做法很麻烦,那我推荐你使用storyboard,这个玩意儿更方便,(只需参照第三步,图五),直接拖一个View放在上面,一步到位,简直so easy(效果就是下面那样,白色的就是tableHeaderView,也是随意在上面放控件就行了)。

iOS 当tableView 遇到Xib(storyBoard)自适应高度_第7张图片
图七.png

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来做,就是下图中,在箭头所指的里面添加属性

iOS 当tableView 遇到Xib(storyBoard)自适应高度_第8张图片
CD1D3A3E-1B4A-454E-834A-B338677E6F1F.png

但是我用的是另一种方法,就是通过category来增加属性,因为我觉得这种写法很方便,至于方便在哪里,后面为你揭晓答案

  • 第一步,新建一个Uiview的Category,如下图
iOS 当tableView 遇到Xib(storyBoard)自适应高度_第9张图片
02173B97-5BCF-4558-B642-9A0F6D6DBBCA.png
  • 第二步,在新建类的.h文件内申明你要添加的属性(注意写法)


    44A1D82E-6FBA-4100-9405-842A9E39C50E.png
  • 第三步, 在.m文件内重写属性的set方法,如下图
iOS 当tableView 遇到Xib(storyBoard)自适应高度_第10张图片
75ACD3CF-F79A-4897-B809-56C5B85BD647.png

最后大功告成 ,你会发现Xib(storyboard)里面所有继承于UIView的类都会增加你手动添加的那些属性(如下图),有没感觉一劳永逸,十分强大。

iOS 当tableView 遇到Xib(storyBoard)自适应高度_第11张图片
A409636E-E889-4D78-9C0E-86052AC6A689.png

代码:

.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中最上边的约束和最下边视图的约束都有
看到没有,只需要两行代码就能解决tableviewCell的自适应高度(切忌不要在代理方法里面再去返回cell的高度,还有xib的约束一定要整对)
以上这些就是我平时用xib时处理一些特殊问题的方法,有什么不对的地方请指出来,我好纠正,谢谢指教。

你可能感兴趣的:(iOS 当tableView 遇到Xib(storyBoard)自适应高度)