Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS表视图单元格高度自适应

iOS表视图单元格高度自适应

作者头像
梧雨北辰
发布于 2018-04-24 06:35:43
发布于 2018-04-24 06:35:43
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

iOS表视图高度自适应可以节省很多麻烦,尤其是涉及到复杂的业务逻辑时,今天尝试了使用Masonry和FDTemplatelayoutCell来布局表视图单元格,从而达到单元格高度自适应的效果,这里就总结了这其中使用的要点和注意问题。

首先,为了实现表视图的单元格高度自适应,我们需要用到Masony和FDTemplatelayoutCell这两个第三方的类库。同时这里使用一个简化的订单界面来说明使用,效果图如下:

屏幕快照 2016-11-11 下午7.23.36.png

一、Masonry和FDTemplatelayoutCell实现自适应

Masnory帮助我们在单元格中设置约束,实现视图的自动布局,这里不再赘述(网上资料很多)。我们需要做的就是使用Masonry对视图单元格中的位于最底部的视图设置bottom约束,使其能够确定距离单元格最低端的距离。一个代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //显示订单价格的Label的约束设置
    [self.orderPriceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
       make.top.equalTo(self.SponsorNameLabel.mas_bottom);
       make.left.equalTo(self.headerImgView.mas_right).offset(leftForHeaderImg);
       make.right.equalTo(self.contentView).offset(-10);
       make.height.mas_equalTo(25);
       make.bottom.mas_offset(-10);//关键代码,设置距离底部10
    }];

FDTemplatelayoutCell 是实现单元格高度自适应的关键代码,是UITableView的类目文件。使用的时候关键步骤包括: 1、注册表视图的单元格 这里分为NIb文件和普通类文件的单元格注册,我使用的是xib文件创建的单元格,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (UITableView *)tableView{
    if (_tableView == nil) {
        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kDeviceWidth, kDeviceHeight- 64) style:UITableViewStylePlain
                      ];
        //注册单元格
        [_tableView registerNib:[UINib nibWithNibName:@"OrderTableViewCell" bundle:nil] forCellReuseIdentifier:self.reuseCellID];
        _tableView.dataSource = self;
        _tableView.delegate = self;
        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
    return _tableView;
}

2、返回单元格高度 返回单元格高度我们就不必计算了,使用如下的方法来返回

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//单元格高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    //调用了FDTemplateLayoutCell的方法
    return  [tableView fd_heightForCellWithIdentifier:self.reuseCellID configuration:^(OrderTableViewCell *cell) {
        //回调中要设置数据
        cell.dataDic = self.dataSource[indexPath.row];
    }];
}
二、遇到的问题:
1.Masonry设置的约束无效

我们要确定设置单元格子视图约束是相对于contentView的,如下的约束就是错误的。因为在布局的时候是相对于self的,这样可能会使约束错乱,自适应高度无效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [self.separateLineView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.top.left.right.equalTo(self);
        make.height.mas_equalTo(10);
    }];
2.结合xib类型单元格使用时的错误

因为我使用了xib文件来加载视图的,所以开始的时候写了如下方法获取单元格

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取单元格
+ (OrderTableViewCell *)getOrderTableViewCell{
    NSArray *array = [[NSBundle mainBundle]loadNibNamed:@"OrderTableViewCell" owner:nil options:nil];
    OrderTableViewCell *view = array[0];
    //设置约束
    [view setupConstraints];
    return view;
}

//返回单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSString *identifier = self.reuseCellID ;
   //单元格注册过,一直可以获取到到单元格
    OrderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.reuseCellID];
    if (cell == nil) {
        //这里代码不会执行,方法中设置约束的代码也不会执行
        cell = [OrderTableViewCell getOrderTableViewCell];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    cell.dataDic = self.dataSource[indexPath.row];
    return cell;
}

因为单元格是注册的,所以在返回单元格方法里判断单元格是否存在是没有意义的,getOrderTableViewCell不会调用,在这个方法里设置的布局约束也是无效的。 修改的方法是如下;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)awakeFromNib {
    [super awakeFromNib];
    //awakeFromNib方法中添加约束
    [self setupConstraints];
}
//返回单元格,不再使用getOrderTableViewCell方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
     OrderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.reuseCellID];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.dataDic = self.dataSource[indexPath.row];
     return cell;
}

四、资料链接 demo示例: https://github.com/DreamcoffeeZS/Demo_FDTemplateLayoutCell Masonry下载: https://github.com/SnapKit/Masonry Masonry的使用: https://github.com/SnapKit/Masonry/blob/master/README.md FDTemplateLayoutCell下载: https://github.com/forkingdog/UITableView-FDTemplateLayoutCell

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.11.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
本文介绍了一种使用Auto Layout、UITableView-FDTemplateLayoutCell以及Masonry结合使用的实践方案,来解决UITableView中cell高度计算的问题。通过Auto Layout让cell自适应视图大小,使用UITableView-FDTemplateLayoutCell自定义单元格布局,再结合Masonry对cell进行布局约束,从而让UITableView的cell高度完全自适应,以解决UITableView中cell高度计算的问题。
ios122
2018/01/02
1.1K0
有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
iOS开发之多表视图滑动切换示例(仿"头条"客户端)
  好长时间没为大家带来iOS开发干货的东西了,今天给大家分享一个头条新闻客户端各个类别进行切换的一个示例。在Demo中对所需的组件进行的简单封装,在封装的组件中使用的是纯代码的形式,如果想要在项目中进行使用,稍微进行修改即可。   废话少说,先介绍一下功能点,下图是整个Demo的功能点,最上面左边的TabBarButtonItem是用来减少条目的,比如下图有三个按钮,点击减号会减少一个条目。右边的为增加一个条目。点击相应的按钮是切换到对应的表视图上,下方红色的是滑动的指示器,同时支持手势滑动。运行具体效果
lizelu
2018/01/11
4K0
iOS开发之多表视图滑动切换示例(仿"头条"客户端)
cell高度的缓存1——利用字典进行缓存
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53203860
用户1451823
2018/09/13
6110
【死磕iOS】处理不等高TableViewCell的小花招
地址://www.jianshu.com/p/a0342ee86431 嗨大家,好久不见~ 今天来和大家一起聊聊处理不等高TableViewCell的那些小花招~ ummmm…其实我是个标题党~ ??
春哥大魔王
2018/04/16
1.5K0
【死磕iOS】处理不等高TableViewCell的小花招
iOS中Cell约束--使用xib实现多label的自动约束--高度随内容自适应
made in 小蠢驴的配图        说起iOS开发,很多人的印象就是-弄一个tableView,把数据全丢到上面展示,听起来好像很粗糙,不过仔细一想,确实展示数据内容的,用的tableView是最多的了吧,说到这里,今天的男一号-tableViewCell就要登场了。       本文的主题是--tableViewCell的高度自适应,计算cell高度的方法确实有好几种,因为做cell的时候,比较简单的界面我都是直接拉xib,手动连接约束比较省事,所以今天就来探索一波-- 使用xib实现cell高度
小蠢驴打代码
2018/05/24
3.8K0
DTCoreText的集成与使用目录一、相关资源二、DTCoreText的集成三、DTCoreText的使用四、可能遇到的错误五、参考链接
DTCoreText是可以将HTML字符串转化为富文本使用的工具,既保证原生实现又能适应灵活的样式修改,而且相比于使用WebView显示内容在性能上也有很大优势。本篇就这一技术的使用进行总结。 目录 一、相关资源 二、DTCoreText的集成 三、DTCoreText的使用 四、可能遇到的错误 五、参考链接 一、相关资源 DTCoreText源码下载 DTCoreText官方文档 DTCoreText集成文档 本文DTCoreText测试工程 温馨提示:文中代码量比较大,看起来可能比较费劲,所以先
梧雨北辰
2018/04/24
5.4K0
DTCoreText的集成与使用目录一、相关资源二、DTCoreText的集成三、DTCoreText的使用四、可能遇到的错误五、参考链接
iOS开发之微信聊天页面实现
  在上篇博客(iOS开发之微信聊天工具栏的封装)中对微信聊天页面下方的工具栏进行了封装,本篇博客中就使用之前封装的工具栏来进行聊天页面的编写。在聊天页面中主要用到了TableView的知识,还有如何在俩天中显示我们发送的表情,具体请参考之前的博客:IOS开发之显示微博表情,在这儿就不做赘述啦。在聊天页面用到了三对,六种Cell,不过cell的复杂度要比之前的新浪微博(IOS开发之新浪围脖)简单的多。废话少说吧,还是先来几张效果图,在给出实现代码吧。   聊天界面的效果图如下:在下面的聊天界面中中用到了3类
lizelu
2018/01/11
4.4K0
iOS开发之微信聊天页面实现
设置Cell的行高:五种方法及优先级1. 四种基本设置方法2. 四种方法的优先级3. 自动进行计算cell的行高
传统意义上设置tableView的行高一共有四种方法。等等,标题不是说有五种方法嘛。别着急,咱们先看四种最基本的方法,最后再说第五种自动计算行高的方法。 1. 四种基本设置方法 1.1 通过代理方法设置 此方法可以返回每一行的具体行高. 代理方法设置行高调用次数特别高,效率很低。有兴致的同学可以在代理方法里面做一下输出,在控制台看看,输出的频率惊人。 为了降低调用的频率,最好设置一个预估行高。这里说的降低频率也只是相对的噢,依然频率不低。 代理方法调用频率非常的原因是想算contentSize,(UITa
stanbai
2018/06/28
1.8K0
iOS自动布局框架之Masonry
目前iOS开发中大多数页面都已经开始使用Interface Builder的方式进行UI开发了,但是在一些变化比较复杂的页面,还是需要通过代码来进行UI开发的。而且有很多比较老的项目,本身就还在采用纯代码的方式进行开发。而现在iPhone和iPad屏幕尺寸越来越多,虽然开发者只需要根据屏幕点进行开发,而不需要基于像素点进行UI开发。但如果在项目中根据不同屏幕尺寸进行各种判断,写死坐标的话,这样开发起来是很吃力的。所以一般用纯代码开发UI的话,一般都是配合一些自动化布局的框架进行屏幕适配。苹果为我们提供的适配
xiangzhihong
2018/01/26
2.3K0
教你写个多表视图
如图所示的多表视图是一个很常用的东西,之前我是用UIScrollView和UITableViewController做的。把当前的控制器作为一个父控制器,添加三个UITableViewController的实例作为子控制器,把父控制器中的 scrollView 作为容器,然后添加子控制器中的 tableView 作为子视图。这样做有一个问题,一旦有十几二十个表的话,内存就要爆炸了。解决的办法是可以自己写个重用机制,不过这显然没必要,用自带重用机制的UICollectionView应该是个更好的选择。
Sheepy
2018/09/10
1.7K0
教你写个多表视图
iOS开发-搜索栏UISearchBar和UISearchController
最近项目中用到了搜索栏,所以在网上搜了一些相关的资料学习了一下,现在记录一下,iOS中的搜索栏实现起来相对简单一点,网上也有很多参考资料,不过靠谱的不是很多,很多都是iOS 8.0之前的实现,iOS 8.0上的实现貌似很少看到,看了一些其他人的代码,使用了一下UISearchController感觉还是非常不错的。好了不多说了 ,来点干货吧。 1 UISearchBar和UIDisplayController实现搜索 是网上最常见的也算是最简单的,也有使用Searh Bar Search Displa
roc
2018/03/30
2.7K0
iOS开发-搜索栏UISearchBar和UISearchController
IOS UITableViewCell 自定义高度动态调整 单元格 常用
//自定义单元格,单元格高度动态调整 1 import UIKit 2 3 class CustomizeUITableViewCell:UITableViewCell, UITableViewDataSource, UITableViewDelegate { 4 5 var tableView:UITableView!; 6 var comments:[String] = [] 7 8 override init(style:UITableViewCellStyle, reuseIde
用户5760343
2019/07/08
1.1K0
android
目前iOS开发中大多数页面都已经开始使用Interface Builder的方式进行UI开发了,但是在一些变化比较复杂的页面,还是需要通过代码来进行UI开发的。而且有很多比较老的项目,本身就还在采用纯代码的方式进行开发。
xiangzhihong
2022/11/30
9700
cell高度的缓存2——利用模型属性缓存
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53204196
用户1451823
2018/09/13
5180
iOS开发过程中的奇淫技巧记录
为了修改带分组tableview的section header跟随置顶的问题,网上的奇淫技巧比方通过修改scroller的回调方法,体验不好,正规的方法是修改为tableView的UITableViewStyleGrouped模式,但该模式下列表section Header的高度过高,需要设置一个footer的高度:
呱牛笔记
2023/05/02
7130
iOS开发过程中的奇淫技巧记录
iOS广告轮播图
1.1 cell 头文件 1.2 cell 实现文件 1.3 cell的使用 引言 在这里插入图片描述 需求背景: 信用卡网申接入(IOS) 实现思路: 自定义cell封装CycleScrollVie
公众号iOS逆向
2021/07/05
8260
iOS广告轮播图
「 UITableView 入门 」新人解决列表 Cell 高度自适应,UITableViewCell 高度自适应
一、前言 我们在写列表的时候,经常出现每一个 Cell 高度不一样的情况,但是 iOS 这边是在是太不智能了 比起隔壁 android 的 RecyclerView ,人家可以自动更具每一项高度,来进行伸缩变化,iOS 的列表控件 UITableView 竟然都不能直接自适应列表高度 二、效果 其实具体的实现并不难,只是没学过的人肯定搞不出来,开始前这里可以先看下效果 大致就是 UITableView 会自动计算每一个 cell 的高度,伸缩变换后显示出来,网上有很多类似的帖子,但是大都纸上谈兵,没图没代码
圆号本昊
2021/09/24
2.7K0
「 UITableView 入门 」新人解决列表 Cell 高度自适应,UITableViewCell 高度自适应
iOS中表视图(UITableView)使用详解
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;  
珲少
2018/08/15
1.6K0
iOS开发——UITableView勾选效果
如今的APP开发中,UITableView是最常用的控件之一,而UITableView中有个很常见的效果就是勾选效果,这个效果是由UITableViewCell中的accessoryType属性来决定的。
Originalee
2018/08/30
2K0
iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决
  最近在项目中经常用到UITableView中的cell中带有UITextField或UITextView的情况,然后在这种场景下,当我们点击屏幕较下方的cell进行编辑时,这时候键盘弹出来会出现遮挡待输入的cell,导致我们无法很方便地查看到我们输入的内容,这样的体验是非常不好的。这个问题在之前我们的随笔iOS学习——键盘弹出遮挡输入框问题解决方案中也有讲过对应的解决方案,但是该方案在最近的应用中还有点小问题,我们在这里重新进行处理好。 一 主控制器为UITableViewController或其子类
mukekeheart
2018/04/04
4.5K0
iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决
推荐阅读
相关推荐
有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验