RZCellSizeManager 1.1.2

RZCellSizeManager 1.1.2

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布上次发布2015年2月

Alex RouseNick Donaldson 维护。



  • Alex Rouse

cell 动态尺寸计算和缓存。

RZCellSizeManager 是一个用于简化 UICollectionView cells 尺寸以及 UITableView cells 高度计算、缓存和检索的对象。它与 AutoLayout 配合得非常好,但您可以在需要简化 cell 尺寸管理时随时使用。

入门

手动

将 RZCellSizeManager 文件夹复制到您的项目中。您只需要 RZCellSizeManager.hRZCellSizeManager.m 两个文件。

实现

要使用 RZCellSizeManager,首先必须初始化其实例。

@property (strong, nonatomic) RZCellSizeManager *sizeManager;
self.sizeManager = [[RZCellSizeManager alloc] init];

一旦我们有了实例,就可以注册不同的 cell 类/nibs。

根据您的使用场景,有几种不同的方法可以实现(请查阅类文档以获取更多信息)

- (void)registerCellClassName:(NSString *)cellClass
                 withNibNamed:(NSString *)nibNameOrNil
           forReuseIdentifier:(NSString *)reuseIdentifier
       withConfigurationBlock:(RZCellSizeManagerConfigBlock)configurationBlock; 

- (void)registerCellClassName:(NSString *)cellClass
                 withNibNamed:(NSString *)nibNameOrNil
               forObjectClass:(Class)objectClass
       withConfigurationBlock:(RZCellSizeManagerConfigBlock)configurationBlock;

上述第一种方法与您的 UITableView 交互工作方式类似。您给 RZCellSizeManager 提供一个 cell 类名、可选的 nib 名称和一个 reuseIdentifier。最后一个参数是一个配置块,您将使用它根据可选模型对象和索引路径配置您的 cell。

[self.sizeManager registerCellClassName:NSStringFromClass([TableViewCell class]) 
                           withNibNamed:nil 
                     forReuseIdentifier:[TableViewCell reuseIdentifier] 
                     configurationBlock:^(TableViewCell* cell, id object) {
                         [cell setCellData:object];
                     }];

如果您传入一个 nil 的 reuseIdentifier,只要您只有一个 cell 类型,这也会正常工作。

第二种方法是使用对象类进行注册。根据在请求 cell 大小时尚未提供的特定对象类,管理器将为您选择正确的 cell。

[self.sizeManager registerCellClassName:NSStringFromClass([TableViewCell class]) 
                           withNibNamed:nil 
                         forObjectClass:[CellData class] 
                     configurationBlock:^(TableViewCell *cell, CellData *object) {
                         [cell setCellData:object];
                     }];

混合这两种不同的方法将导致不支持的行为。

在这种情况下,我们将在 cell 上设置一个对象,这将设置两个不同的标签。这两个标签都使用自动布局进行配置,因此它们的大小将根据内容进行调整。以下是一个 setCellData: 方法的示例

// Using AutoLayout
- (void)setCellData:(CellData *)cellData
{
    self.titleLabel.text = cellData.title;
    self.descriptionLabel.text = cellData.subTitle;
}

然后,只需实现 UITableViewDelegate 方法并在特定的索引路径上请求 sizeManager 的大小或高度。

对于 ReuseIdentifier 方法,我们只需要额外传递一个参数作为要使用以获取基于索引路径的高度所需 cells 的 reuse identifier。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Retrieve our object to give to our size manager.
   id object = [self.dataArray objectAtIndex:indexPath.row];
   return [self.sizeManager cellHeightForObject:object indexPath:indexPath cellReuseIdentifier:[TableViewCell reuseIdentifier]];    
}

对于对象类方法,RZCellSizeManager 将根据提供的对象类来确定正确的 cell 以使用,因此这个调用甚至更简单。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Retrieve our object to give to our size manager.
   id object = [self.dataArray objectAtIndex:indexPath.row];
   return [self.sizeManager cellHeightForObject:object indexPath:indexPath];
}

然后完成了!您的所有 cell 的尺寸都将被缓存,以便任何未来的调用都将非常快速。

清除尺寸

如果您使用RZCellSizeManager,并且数据发生变化,您需要使它的缓存无效,以便它可以计算新的高度。这可以通过提供特定的索引路径来完成,或者您也可以使整个缓存无效。

- (void)invalidateCellHeightCache;
- (void)invalidateCellHeightAtIndexPath:(NSIndexPath *)indexPath;
- (void)invalidateCellHeightsAtIndexPaths:(NSArray *)indexPaths;

下一步操作

查看示例项目,了解如何使用RZCellSizeManager的简单示例,如果您有关于未来改进的好主意,请随时添加问题和拉取请求。另请参阅有关RZCellSizeManager的博客文章:此链接