热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

处理不等高TableViewCell

课题一:如何计算Cell高度方案一:直接法(面向对象)想知道妹纸爱你有多深?直接去问妹纸本人吧!嗯!Cell也是一样的,想知道cell到底有多高?直接问Cell本
课题一:如何计算Cell高度

方案一:直接法(面向对象)

想知道妹纸爱你有多深?直接去问妹纸本人吧!

嗯!Cell也是一样的,想知道cell到底有多高?直接问Cell本人就好了。直接法,就是把数据布局到Cell上,然后拿到Cell最底部控件的MaxY值。

  • 第一步:创建Cell并正确设置约束,使文字区域高度能够根据文字内容多少自动调整

    #import "TestCell.h" @interface TestCell () @property (strong, nonatomic) IBOutlet UILabel *longLabel; @property (strong, nonatomic) IBOutlet UIView *bottomCub; @end @implementation TestCell // Cell的构造方法 + (instancetype)creatWithTitle :(NSString *)title inTableView :(UITableView *)tableView { TestCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(self)]; if (!cell) { cell = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:kNilOptions].lastObject; } cell.longLabel.text = title; return cell; } /** * 拿到bottomCub的最大Y值并返回 */ - (CGFloat)cellHeight { // 强制布局之前,需要先手动设置下cell的真实宽度,以便于准确计算 CGRect rect = self.frame; rect.size.width = [[UIScreen mainScreen] bounds].size.width; self.frame = rect; [self layoutIfNeeded]; // 一定要强制布局下,否则拿到的高度不准确 return CGRectGetMaxY(self.bottomCub.frame); } @end
    • 第四步:在代理方法中设置Cell高度
      *注意:计算Cell高度的过程,一定不要放在heightForRow代理方法中!这一点在后文中将会有所提及。
    #import "AskCellViewController.h"
    #import "TestCell.h"
    
    @interface AskCellViewController ()<UITableViewDelegate,UITableViewDataSource>
    @property (strong, nonatomic) UITableView *tableView;
    
    /** 测试数据 - Cell中文字内容数组*/
    @property(copy,nonatomic) NSArray *testTitleArray;
    
    @end
    
    @implementation AskCellViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.view addSubview:self.tableView];
    
        self.tableView.frame = self.view.bounds;
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
        self.tableView.tableFooterView = [[UIView alloc] init];
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        TestCell *cell = [TestCell creatWithTitle:self.testTitleArray[indexPath.row] inTableView:tableView];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        return cell;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    // *注意:计算Cell高度的过程,一定不要放在此代理方法中!这一点在后文中将会有所提及,此处仅为演示方便
        CGFloat cellHeight = [[TestCell creatWithTitle:self.testTitleArray[indexPath.row] inTableView:tableView] cellHeight];
        NSLog(@"%f",cellHeight);
        return cellHeight;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return self.testTitleArray.count;
    }
    #pragma mark - Lazy
    - (UITableView *)tableView
    {
        if (!_tableView) {
            _tableView = [[UITableView alloc] init];
        }
        return _tableView;
    }
    
    
    - (NSArray *)testTitleArray
    {
        return @[@"我是第一个Cell",@"我是第二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二个Cell",@"我是第三个Cell"];
    }
    
    @end
    • 效果
      CGSize size = [cell.content sizeThatFits:CGSizeMake(cell.content.frame.size.width, MAXFLOAT)];

      (注于:2016.1.28)

      • 第一步:硬生生的将每个Cell的高度算出来,并保存在一个数组中
      • 第二步:heightForRow方法中返回相应的CellHeight
      #import "CalculatorViewController.h"
      #import "TestCell.h"
      
      @interface CalculatorViewController ()<UITableViewDelegate,UITableViewDataSource>
      
      @property (strong, nonatomic) UITableView *tableView;
      /** 测试数据 - Cell中文字内容数组*/
      @property(copy,nonatomic) NSArray *testTitleArray;
      /** 用来存Cell高度的数组*/
      @property(copy,nonatomic) NSArray *cellHeightArray;
      
      @end
      
      @implementation CalculatorViewController
      
      - (void)viewDidLoad {
          [super viewDidLoad];
          [self.view addSubview:self.tableView];
      
          self.tableView.frame = self.view.bounds;
          self.tableView.delegate = self;
          self.tableView.dataSource = self;
          self.tableView.tableFooterView = [[UIView alloc] init];
      }
      
      
      - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
      {
          TestCell *cell = [TestCell creatWithTitle:self.testTitleArray[indexPath.row] inTableView:tableView];
          cell.selectionStyle = UITableViewCellSelectionStyleNone;
          return cell;
      }
      - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
      {
          CGFloat cellHeight = [self.cellHeightArray[indexPath.row] floatValue];
          return cellHeight;
      }
      - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
      {
          return self.testTitleArray.count;
      }
      #pragma mark - Lazy
      - (UITableView *)tableView
      {
          if (!_tableView) {
              _tableView = [[UITableView alloc] init];
          }
          return _tableView;
      }
      - (NSArray *)testTitleArray
      {
          return @[@"我是第一个Cell",@"我是第二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二个Cell",@"我是第三个Cell"];
      }
      - (NSArray *)cellHeightArray
      {
          NSMutableArray *cellHeightTMPArray = [@[] mutableCopy];
          // 开始硬生生的计算每一个Cell高度
          for (NSString *string in self.testTitleArray) {
              CGFloat cellHeight = 0;
              // 一个Cell由两部分组成 - 高度自动调整的Label & bottomCub
              // bottomCub高度是确定的 - 120,Label和bottomCub之间的间距是确定的 - 8
              static CGFloat bottomCubHeight = 120;
              static CGFloat bottomMargin = 8;
              // 计算Label的高度 - 其实就是计算Lable中的String的总高度
                  // 1. 拿到将要放入Lable的String
              NSString *stringForLabel = string;
              // 2. 根据文字内容、字体(固定值)、文字区域最大宽度计算String总高度
              static CGFloat fOntSize= 17;
              CGFloat labelHeight = [stringForLabel sizeWithFont:[UIFont systemFontOfSize:fontSize] constrainedToSize:CGSizeMake(self.tableView.frame.size.width, CGFLOAT_MAX)].height;
                  // 3. 拿到了总高度,放入数组
              cellHeight = labelHeight + bottomMargin + bottomCubHeight;
      
              [cellHeightTMPArray addObject:@(cellHeight)];
          }
          return cellHeightTMPArray;
      }
      @end
      • 效果
        ummmm就不给效果图了哦,和上一张是一样一样的~

      方案三:利用iOS8新特性

      想知道妹纸爱你有多深?知道这个干嘛,直接通过iOS8,让妹纸爱上你不就好啦~

      其实,iOS8已经提供了直接通过XIB让Cell高度自适应的方法了,只要简单拖拖线,根本木有必要计算Cell高度,就可以搞定不等高Cell

      • 第一步:设置tableView的估算Cell高度&rowHeight值为自动计算模式
      - (void)viewDidLoad {
          [super viewDidLoad];
      
          self.tableView.estimatedRowHeight = 100;  // 随便设个不那么离谱的值
          self.tableView.rowHeight = UITableViewAutomaticDimension;
      }
      • 第二步:为Cell中最下面的View设置约束 - 除了要定高、定宽、左上角粘着Label外,还要设置bottom距contentView的bottom间距为固定值,如0
      var cpro_id = "u6885494";
      推荐阅读
      • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
      • 本文详细介绍了如何在Unity中实现一个简单的广告牌着色器,帮助开发者更好地理解和应用这一技术。 ... [详细]
      • 本文介绍了如何在AX2012中通过自定义查询在数据网格视图中显示所有记录的方法。 ... [详细]
      • 本文介绍了如何通过Sybase Central连接到示例数据库,并查看其中的表和其他对象。主要内容包括启动Sybase Central、建立连接、查看表列表及表的具体信息。 ... [详细]
      • 第二十五天接口、多态
        1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
      • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
      • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
      • 基于Web的Kafka管理工具Kafkamanager首次访问Web界面的详细配置指南(附图解)
        首次访问Kafkamanager Web界面时,需要对Kafka集群进行配置。这一过程相对简单,用户只需依次点击【Cluster】>【Add Cluster】,按照提示完成相关设置即可。本文将通过图文并茂的方式,详细介绍每一步的配置步骤,帮助用户快速上手Kafkamanager。 ... [详细]
      • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
      • XAMPP 遇到 404 错误:无法找到请求的对象
        在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
      • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
      • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
        开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
      • 装饰者模式(Decorator):一种灵活的对象结构设计模式
        装饰者模式(Decorator)是一种灵活的对象结构设计模式,旨在为单个对象动态地添加功能,而无需修改原有类的结构。通过封装对象并提供额外的行为,装饰者模式比传统的继承方式更加灵活和可扩展。例如,可以在运行时为特定对象添加边框或滚动条等特性,而不会影响其他对象。这种模式特别适用于需要在不同情况下动态组合功能的场景。 ... [详细]
      • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
      • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
        本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
      author-avatar
      一枝草一滴露的执着
      这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有