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

时间:2014-08-21 16:52:59

标签: cocoa-touch uitableview

我从不同的角度对此有不同的看法,我想澄清一下。当调用tableView:heightForRowAtIndexPath:,一个必需的方法时,我可以根据其中的数据动态调整单元格高度吗?这可以“即时”完成,还是需要标准化五个或六个原型单元,并根据reuseIdentifier选择要使用的单元格。

例如我打电话

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

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

2 个答案:

答案 0 :(得分:1)

答案:是的 - 是的,它可以像你说的那样“一飞”。是的,即使单元格具有相同的重用标识符,您也可以使用该方法为每个单元格赋予不同的高度。如果我要用不同的单元格显示不同的东西,我通常会为单元格使用不同的重用标识符。

BTW,heightForRowAtIndexPath不是必需的方法 - 只有你有不同高度的单元格(如你所愿)才有必要。

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

BTW3:你对heightForRow的实现很奇怪:首先,indexPathForSelectedRow返回一个indexPath,它不是一个标量(因此你不能* 20) - 实际上这不应该编译。其次,即使它起作用,这也会给每个细胞提供相同的高度。

答案 1 :(得分:1)

在iOS 8中,您可以使用自动布局来采用不同的高度。 This is covered in this answer very nicely.

在iOS 7及更早版本中,自动布局无法实现。 UIKit使用两步过程来呈现表格视图:

  1. 收集表格视图中所有单元格的高度
  2. 在需要显示时获取UITableViewCell对象
  3. 高度必须由- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath返回。

    每次为每个单元格调用此委托方法,如Apple在documentation中所述:

      

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

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

      

    我可以根据其中的数据动态调整单元格高度   他们吗

    是的,你可以,但你必须在heightForRowAtIndexPath内完成。您无法在- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;

    范围内动态更改高度