热门标签 | 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";
      推荐阅读
      • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
      • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
      • Android 渐变圆环加载控件实现
        本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
      • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
      • Android LED 数字字体的应用与实现
        本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
      • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
      • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
      • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
      • 高效提取PDF页面的实用技巧
        在学习和工作中,我们经常需要与他人共享PDF格式的资料。然而,有时只需要分享部分内容,而不仅仅是整个文档。本文将介绍如何使用福昕阅读器领鲜版高效地提取PDF页面,以提高文件传输效率和查阅便捷性。 ... [详细]
      • RecyclerView初步学习(一)
        RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
      • 2023年京东Android面试真题解析与经验分享
        本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
      • 从 .NET 转 Java 的自学之路:IO 流基础篇
        本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
      • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
      • MacOS上高效的SVN管理工具Cornerstone安装指南
        本文详细介绍如何在MacOS上安装和配置高效SVN管理工具Cornerstone,涵盖其主要功能和优化后的性能提升。 ... [详细]
      • 帝国CMS多图上传插件详解及使用指南
        本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ... [详细]
      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社区 版权所有