我从不同的角度对此有不同的看法,我想澄清一下。当调用tableView:heightForRowAtIndexPath:
,一个必需的方法时,我可以根据其中的数据动态调整单元格高度吗?这可以“即时”完成,还是需要标准化五个或六个原型单元,并根据reuseIdentifier
选择要使用的单元格。
例如我打电话
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [tableView indexPathForSelectedRow]*20;
}
这会立即吸取所有必要的细胞,然后仍然会交换掉这些相同的细胞,或者一旦它们离开屏幕就会重新绘制细胞。为什么我需要有多个原型单元?
答案 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使用两步过程来呈现表格视图:
高度必须由- (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;