多重重用标识符-不同高度的UITableView单元格



我从不同的来源得到了不同的观点,我想澄清一下。当调用tableView:heightForRowAtIndexPath:时,一个必需的方法,我可以根据其中的数据动态调整单元格高度吗?这可以"在飞行中"完成吗?还是我需要标准化五个或六个原型单元,并根据其reuseIdentifier选择使用哪个单元?

例如我调用

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  return [tableView indexPathForSelectedRow]*20;
}

会立即绘制所有必要的单元格,然后仍然交换出这些相同的单元格,或者一旦它们离开屏幕它会重新绘制单元格。为什么我需要多个原型单元格?

回答:是的-是的,正如你所说的,它可以"一次"完成。是的,你可以给每个细胞使用该方法不同的高度,即使细胞有相同的重用标识符。如果我要用不同的单元格显示不同的东西,我通常会为单元格使用不同的重用标识符。

BTW, heightForRowAtIndexPath不是必需的方法-只有当您有不同高度的单元格时才需要(如您所希望的那样)。

BTW2: heightForRowAtIndexPath将在渲染单元格之前对每个索引路径调用,因此表视图可以计算内容的总高度。

BTW3:你实现的highightforrow…很奇怪:首先,indexPathForSelectedRow返回一个indexPath,它不是一个标量(因此您不能* 20它)—实际上,这不应该编译。其次,这将给每个单元格相同的高度,如果它甚至工作。

在iOS 8中,你可以使用自动布局来适应不同的高度。这个答案很好地涵盖了这一点。

在iOS 7和更早的版本中,这在自动布局中是不可能的。UIKit使用两步过程来呈现表视图:

  1. 收集表视图中所有单元格的高度
  2. 获取UITableViewCell对象,当他们需要显示

高度必须由- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath返回。

这个委托方法每次对每个单元格调用,正如Apple在文档中所述:

每次显示表视图时,它都会调用tableView:heightForRowAtIndexPath:在它的每一个这可能会导致表的严重性能问题具有大量行(大约1000或更多)的视图。

为了加快速度,iOS 7引入了- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath来给出高度的近似值。

我可以根据内部数据动态调整单元格高度他们吗?

是的,你可以,但你必须在heightForRowAtIndexPath内做。不能在- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;

内动态更改高度

最新更新