动态计算UITableviewcell高度

简介: 在iOS开发中,我们少不了和UITableview打交道,因为UITableview也是UIKit中最复杂的一个控件了。在使用UITableview的过程中,UITableviewCell也是必不可少的,页面列表形式的展示可谓是各种各样,相信不少童鞋们也曾为复杂的页面布局困惑过,其中比较难的也就数cell的高度自适应了,也就是说cell的高度是根据内容来动态计算的。

在iOS开发中,我们少不了和UITableview打交道,因为UITableview也是UIKit中最复杂的一个控件了。在使用UITableview的过程中,UITableviewCell也是必不可少的,页面列表形式的展示可谓是各种各样,相信不少童鞋们也曾为复杂的页面布局困惑过,其中比较难的也就数cell的高度自适应了,也就是说cell的高度是根据内容来动态计算的。


1.不使用Autolayout的时候,计算cell的高度:

//返回cell的的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    PhotoInfo *photoInfo = [self.dataArr objectAtIndex:indexPath.row];
    [self heightForRowWithModel:photoInfo];
}
//动态计算cell的高度 
- (CGFloat)heightForRowWithModel:(PhotoInfo *)photoInfo 
{ 
    //这里只写了label的计算
    //文本的高度 
    CGSize texSize = [self labelAutoCalculateRectWith:photoInfo.instruction FontSize:15 MaxSize:CGSizeMake(200,1000)];
    //3.返回cell 的总高度 
    return 44 + textSize.height;
}  
/*根据传过来的文字内容、字体大小、宽度和最大尺寸动态计算文字所占用的size
              * text 文本内容 
              * fontSize 字体大小
              * maxSize  size(宽度,1000)
              * return  size (计算的size)
              */
- (CGSize)labelAutoCalculateRectWith:(NSString*)text FontSize:(CGFloat)fontSize MaxSize:(CGSize)maxSize
{
    NSMutableParagraphStyle* paragraphStyle = [[NSMutableParagraphStyle alloc]init];
   paragraphStyle.lineBreakMode=NSLineBreakByWordWrapping;
    NSDictionary* attributes =@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSParagraphStyleAttributeName:paragraphStyle.copy};
    CGSize labelSize;
      //如果是IOS6.0
    if (![text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]){
        labelSize = [text sizeWithFont:[UIFont systemFontOfSize:fontSize] constrainedToSize:maxSize lineBreakMode:NSLineBreakByWordWrapping];
    }
    //如果系统为iOS7.0
    else
  {
          // iOS7中用以下方法替代过时的iOS6中的sizeWithFont:constrainedToSize:lineBreakMode:方法
        labelSize = [text boundingRectWithSize: maxSize
                                       options: NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading|NSStringDrawingTruncatesLastVisibleLine
                                    attributes:attributes
                                       context:nil].size;
    }
    labelSize.height=ceil(labelSize.height);    
    labelSize.width=ceil(labelSize.width);
    return labelSize;
}


2.使用Autolayout,- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize这个方法就能搞定。不过,首先要在Xib上布局cell。


image.png

//返回cell高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    SystemMSGTableViewCell *cell = self.cell;
    SystemmsgInfo *data = self.dataArr[indexPath.row];
    CGFloat height = [cell heightForCell:data];
    return height;
} 
//动态计算cell的高度
- (CGFloat)heightForCell:(SystemmsgInfo *)data
{
    self.widthLabel.constant = ScreenWidth - 40;
    self.contentLabel.text = data.promotionInfo;
    CGSize size = [self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    NSLog(@"h=%f", size.height + 1);
    return 1  + size.height;
}


image.png

相关文章
|
XML 存储 JSON
Android Jetpack组件 DataStore的使用和简单封装
Android Jetpack组件 DataStore的使用和简单封装
1460 0
Android Jetpack组件 DataStore的使用和简单封装
|
10月前
|
运维 监控 安全
代理IP故障排查,怎样快速锁定问题?
在信息化时代,互联网不可或缺,业务需求使HTTP动态代理IP的应用日益广泛。为快速排查代理IP故障,可采取以下步骤:1. 检查代理IP有效性(Ping测试、HTTP请求测试);2. 监控连接速度(延迟、带宽测试);3. 分析错误信息(HTTP状态码、错误日志);4. 检查代理设置(配置文件、协议支持);5. 使用调试工具(Wireshark、浏览器开发者工具);6. 咨询服务提供商;7. 检查网络环境(防火墙、ISP限制);8. 逐步故障排除并记录变化。通过这些方法,能有效找出并解决问题。
360 5
|
12月前
|
机器学习/深度学习 人工智能 算法
《C++与 ONNX:构建跨平台推理引擎的智慧融合》
本文探讨了如何在 C++ 中整合 ONNX 格式模型,实现跨平台部署。首先介绍了 ONNX 的重要性和跨平台部署的意义,然后详细阐述了整合 ONNX 模型到 C++ 推理引擎的步骤,包括模型解析、计算图构建、节点计算功能实现、内存管理和跨平台适配。最后讨论了性能优化、模型兼容性和开发复杂性等挑战及解决方案,并展望了未来的发展前景。
341 9
|
Swift iOS开发
iOS 用一个布局来解决嵌套问题—— UICollectionViewCompositionalLayout
iOS 用一个布局来解决嵌套问题—— UICollectionViewCompositionalLayout
iOS 用一个布局来解决嵌套问题—— UICollectionViewCompositionalLayout
|
存储 传感器 监控
物联网:物联网卡为什么没有语音功能
物联网卡(IoT SIM卡)主要是为物联网设备设计的,这些设备包括但不限于智能城市传感器、可穿戴设备、工业监控设备、车联网设备等。与普通的消费者SIM卡相比,物联网卡在功能和设计上存在一些显著的区别,其中不包括语音功能是其重要特点之一。以下是物联网卡没有语音功能的几个主要原因:
|
存储 Ubuntu 开发工具
在Ubuntu 18.04上安装Git的方法
在Ubuntu 18.04上安装Git的方法
273 0
|
存储 移动开发 缓存
多个WKWebView页面的cookie不共享问题及解决方案
多个WKWebView页面的cookie不共享问题及解决方案
382 0
|
Unix iOS开发 Ruby
Mac 从零安装cocoapods
最近申请换了台 MacBook Pro(之前用的是MacBook Air),一台干净的像小孩子屁股一样的电脑,iOS开发相关的常用软件一个也没有。当下载了item2(本人很不喜欢Mac自带的终端,所以还是习惯的下载了item2,如果有小伙伴需要了解,请点击https://www.jianshu.com/p/93f5c3491954)Xcode和项目后,由于我们项目用了cocoapods,所以不得不安装它。关于cocoapods的介绍就不多说了,下面直接开始安装步骤吧!
Mac 从零安装cocoapods
|
搜索推荐 C语言 C++
【数据结构】经典排序算法—C/C++实现
【数据结构】经典排序算法—C/C++实现
356 1
|
Linux 开发工具 git
CentOS 安装 nvm
CentOS 安装 nvm
956 3