免费开源的iOS开发学习平台

UITableView详解:12-动态调整Cell高度(self-sizing)

在iOS 8中,苹果引入了UITableView的一项新功能–Self Sizing Cells,对于不少开发者来说这是新SDK中一项非常有用的新功能。在iOS 8之前,如果需要在单元格中展示可变高度的动态内容时,需要手动计算行高,而Self Sizing Cells为展示动态内容提供了一个解决方案。

self-sizing相关属性与方法

当需要使用self-sizing功能时,需要同时满足如下几个预设条件才能使用。

  • 确认需要适配的iOS版本高于iOS8

  • 必须使用自动布局方式来定义单元格的样式

  • 设置表视图的estimatedRowHeight属性,即单元格的预估行高,一般设置为单元格的默认行高

@property (nonatomic) CGFloat estimatedRowHeight;
  • 将表视图的rowHeight属性设置为UITableViewAutomaticDimension
UIKIT_EXTERN const CGFloat UITableViewAutomaticDimension;

示例代码

下方的示例代码在前面自定义单元格章节的代码基础上进行了修改,实现了可以动态改变单元格的行高。

  • 使用XIB搭建Cell并设置约束。对于需要动态调整高度的控件,在使用自动布局设置约束时,一定不要设置其绝对高度,其高度要根据控件与其他控件的相对位置约束来确定。

  • 针对可变高度的UILabel需要设置其行数Lines为0

  • 为表视图设置estimatedRowHeight以及rowHeight属性
    self.tableView.estimatedRowHeight = 127;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
  • 更新MYModle类的初始化方法,随机获取content属性的内容
+(instancetype)myCellModel {
    MYModel *cellModel = [[MYModel alloc]init];    
    cellModel.userName = @"99iOS";
    cellModel.profileImageName = @"99logo";
    cellModel.iconName = @"99logo";
    cellModel.source = @"来自99的iPhone 7 Plus";
    int arcNumber = arc4random_uniform(2);
    if (arcNumber == 1) {
        cellModel.content = @"对于需要动态调整高度的控件,在使用自动布局设置约束时,一定不要设置其绝对高度,其高度要根据控件与周边其他控件的位置约束来决定。如下图所示";
    }else {
        cellModel.content = @"苹果iOS开发进阶之路";
    }
    return cellModel;
}

运行效果:

示例代码

https://github.com/99ios/8.2.12