UITableViewCell 高度自适应

UITableViewCell 高度自适应一直是我们做动态Cell高度时遇到的最烦躁的问题,Cell动态高度计算可以去看看sunny的这篇文章介绍,今天主要和大家分享下我在使用systemLayoutSizeFittingSize系统自带方法计算高度的一些心得!

Demo gif

先看原函数注释

/* The size fitting most closely to targetSize in which the receiver‘s subtree can be laid out while optimally satisfying the constraints. If you want the smallest possible size, pass UILayoutFittingCompressedSize; for the largest possible size, pass UILayoutFittingExpandedSize.
 Also see the comment for UILayoutPriorityFittingSizeLevel.
 */- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize NS_AVAILABLE_IOS(6_0); // Equivalent to sending -systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority: with UILayoutPriorityFittingSizeLevel for both priorities.

从注释中我们可以看出,当你的约束条件配置好后它可以计算出最接近目标的Size,那我们该如何下手呢?

1.首先我们需要建一个UITableViewCell

假如我们Cell的布局如下所示:

Cell所对应的Class我们取名为ZHCalculateTableViewCell
所带属性我们定义为:

@interface ZHCalculateTableViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *TitleLabel;
@property (weak, nonatomic) IBOutlet UILabel *ContentLabel;
@property (weak, nonatomic) IBOutlet UIImageView *showImgView;
@property (weak, nonatomic) IBOutlet UILabel *UseNameLabel;
@property (weak, nonatomic) IBOutlet UILabel *TimeLabel;
@property (strong, nonatomic) ZHCalculateHeightModel *model;
@end

看到这里也许你会疑惑ZHCalculateHeightModel是什么,它是我们Cell所要展示的数据来源!

2.然后我们为我们的Cell建个数据模型

Cell的模型名称我们暂定为:ZHCalculateHeightModel
所带属性:

@interface ZHCalculateHeightModel : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *content;
@property (nonatomic, strong) NSString *username;
@property (nonatomic, strong) NSString *time;
@property (nonatomic, strong) NSString *imageName;

Ok,数据模型建立好了,展示的TableViewCell也有了, Just Show it~

3. 建一个继承于UITableViewControllerZHCustomLayoutTableViewController

  • 建一个在函数-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath中调用的Cell:

    @property (nonatomic, strong)  ZHCalculateTableViewCell *prototypeCell;
  • 注册Cell
[self.tableView registerNib:[UINib nibWithNibName:@"ZHCalculateTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:CellIdentifier];
self.tableView.estimatedRowHeight = 100;//很重要保障滑动流畅性
self.prototypeCell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  • 动态计算高度
   -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    ZHCalculateTableViewCell *cell = self.prototypeCell;
    cell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
    [self configureCell:cell atIndexPath:indexPath];//必须先对Cell中的数据进行配置使动态计算时能够知道根据Cell内容计算出合适的高度

    /*------------------------------重点这里必须加上contentView的宽度约束不然计算出来的高度不准确-------------------------------------*/
    CGFloat contentViewWidth = CGRectGetWidth(self.tableView.bounds);
    NSLayoutConstraint *widthFenceConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:contentViewWidth];
    [cell.contentView addConstraint:widthFenceConstraint];
    // Auto layout engine does its math
    CGFloat fittingHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    [cell.contentView removeConstraint:widthFenceConstraint];
    /*-------------------------------End------------------------------------*/

    return fittingHeight+2*1/[UIScreen mainScreen].scale;//必须加上上下分割线的高度
}

#pragma mark Configure Cell Data
- (void)configureCell:(ZHCalculateTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    cell.model = [dataArray objectAtIndex:indexPath.row];//Cell中对其进行处理
}

ZHCalculateTableViewCell Model的Set函数重写为

#pragma mark - Setters
-(void)setModel:(ZHCalculateHeightModel *)model
{
    _model = model;
    self.TitleLabel.text = model.title;
    self.ContentLabel.text = model.content;
    self.showImgView.image = model.imageName.length > 0 ? [UIImage imageNamed:model.imageName] : nil;
    self.UseNameLabel.text = model.username;
    self.TimeLabel.text = model.time;

}

扩展

我们可以在计算高度后对其进行缓存,下次可以直接返回!

总结

  • -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath一定不要用ZHCalculateTableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];来获取Cell。
  • 上述动态计算Cell高度中最最重要的是需要在计算前先初始化Cell中的数据。
  • 一定要对ContentView加上宽度约束。
    CGFloat contentViewWidth = CGRectGetWidth(self.tableView.bounds);
      NSLayoutConstraint *widthFenceConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:contentViewWidth];
      [cell.contentView addConstraint:widthFenceConstraint];
      // Auto layout engine does its math
      CGFloat fittingHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
      [cell.contentView removeConstraint:widthFenceConstraint];

Demo 下载地址

GitHub

时间: 2024-11-05 21:51:15

UITableViewCell 高度自适应的相关文章

uitableviewcell高度自适应笔记

今天看了几篇uitableviewcell高度自适应的文章,大体分为两种方式. 第一种方式,cell里面有label,在cellforrow绘制的时候计算Label的可能高度,并且在此时重新计算cell的高度,然后在heightforrow的时候返回这个cell新的高度.也就是说这些cell全部是计算出来的,根据里面的label的高度(label为contentView).http://blog.csdn.net/swingpyzf/article/details/18093959 第二种方式是

UITableViewCell高度自适应的关键点

iOS开发中对于UITableViewCell高度自适应的文章已经很多很多,但如果cell内容比较复杂,刚使用autolayout配置自使用时还是总不能一次性成功. KEY POINT 这里只说设置的关键一点: Cell内部的Constraints一定要有一条从Cell顶部到底部的一条可联通线. 图例列表: Paste_Image.png Paste_Image.png Paste_Image.png 最后顶部元素居上和底部元素距底部,加上约束即可.这条线上可以有固定高度的元素,可以有自适应高度

UITableViewCell 高度计算从混沌初始到天地交泰

[原创]UITableViewCell 高度计算从混沌初始到天地交泰 本文主要基予iOS UITableViewCell 高度自适应计算问题展开陈述,废话少说直入正题: UITableView控件可能是iOS中大家最常用的控件了(滚动视图.cell重用.卡顿优化),今天要讨论的不是这些高大上的话题,今天的话题只是cell高度的计算. * 传统frame布局下UITableViewCell 高度计算 * AutoLayout下UITableViewCell高度计算(iOS6.7) * UITabl

autolayout 高度自适应

https://lvwenhan.com/ios/449.html #import "ViewController.h" #import "MyTableViewCell.h" static NSString *cellIdentifier = @"mycell"; @interface ViewController () <UITableViewDelegate, UITableViewDataSource> @property (

UI_11 自定义UITableViewCell、Cell的高度自适应

UITableViewCell很难满足我们的需求,因此,CustomCell(自定义单元格)至关重要.下面将通过一个例子演示自定义Cell.第二部分演示根据文本内容自适应Label.Cell高度. 第一部分 CustomCell的创建 1.创建DemoTableViewController,继承自UITableViewController,并设置其为window的根视图 AppDelegate.m - (BOOL)application:(UIApplication *)application

AutoLayout五、使用Masonry完成UITableViewCell的自适应高度

第一步.Base TableViewController 封装tableView的 数据源方法.代理方法.这里只给出cell height的代理函数部分: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { //不使用高度自适应的cell,返回其设置的默认高度 if (![[self cellClass] isDynamic]) { return [sel

iOS UITableView+FDTemplateLayoutCell 配合AutoLayout分分钟教你实现动态高度自适应

UITableView里面的Cell固定高度那是基本不可能了,很多功能和界面都会涉及到高度自适应,而且电商类的尤其普遍,之前都是自己算啊算,代码写的非常多,逻辑还没写,光这布局UI和高度计算都能接近1000了,写完之后关键出点Bug整个人都不好了 当时的是这样的: 突然在github上看到UITableView+FDTemplateLayoutCell这个库 传送门:点击打开链接 刚看到的时候是这样的: 能  用   么 ??? 真  的  这  么 叼 ??? 第一次用的时候是这样的: 哥们,

关于TableViewCell高度自适应问题的整理

TableViewCell高度自适应在网上有很多资料,我只想找出最最最简单的一种方法. 首先梳理一下思路.说到TableViewCell我们第一个想到的问题或许就是cell的复用问题. 1.  [self.tableView registerClass:[Cell class] forCellReuseIdentifier:str];注册之后可以在cell代理函数里调用 Cell *cell = [tableView dequeueReusableCellWithIdentifier:str f

tableviewheaderview&#160;高度自适应

完全使用约束 使tableviewheaderview 的高度自适应,以后再也不用去计算headerview的高度后再去改变高度了, demo代码: #import "ViewController.h" #import "Masonry.h" @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> @end @implementation ViewController