heightForRowAtIndexPath 总是被调用两次

Posted

技术标签:

【中文标题】heightForRowAtIndexPath 总是被调用两次【英文标题】:heightForRowAtIndexPath always called twice 【发布时间】:2010-12-16 15:39:17 【问题描述】:

我很难理解 UITableViewController 的流程。基本上这是我的结构:

我有一个 tableViewController,它当然包含一个 tableView。在这里,我使用 getCellContentView 和 cellForRowAtIndexPath 来完成与我的单元格相关的所有工作。我的单元格有几个带有自己框架的 UILabel,每个方向一个。我检测并正确执行所有方向更改和帧重绘。那里没有问题。到目前为止一切顺利。

现在我需要 heightForRowAtIndexPath 为横向返回 100 并为纵向返回 200。我的问题是,当我在其中使用 NSLog 时,无论出于何种原因,当我旋转 tableView 时,该方法都会被调用两次。任何人都知道为什么该方法在旋转时被触发两次?我认为 -reloadData 可能是问题所在,我验证了我是否以某种方式两次调用 -reloadData 旋转,但没有。我只在 willRotateToInterfaceOrientation 方法中调用 -reloadData 一次,并且在代码中的其他任何地方都没有调用它(除了在第一个 viewDidLoad 调用中)。

为什么 heightForRowAtIndexPath 在每次旋转事件中被调用两次?当旋转开始时,heightForRowAtIndexPath 似乎也无法正确确定方向。我使用状态栏方向属性检查 heightForRowAtIndexPath 内部是否返回适当的单元格高度。任何帮助都会很棒!

【问题讨论】:

【参考方案1】:

谁在乎它被调用了多少次:)

您的 heightForRowAtIndex: 实现应该足够快,以便表格视图可以随时调用它,这并不重要。

但是,如果我不得不推测,旋转是分两个阶段完成的(查看 UIViewController 文档中的 didAnimateFirstHalfOfRotationToInterfaceOrientation: 等。)你不知道 UIKit 的 UITableViewController 类在旋转期间做了什么 - 也许它正在刷新表格给你看?

您是否尝试过覆盖 willRotateToInterfaceOrientation: 它应该为您提供您正在旋转的方向 - 您可以使用它来设置您想要的单元格的高度吗?

类似这样的东西:(警告,未经测试,凭记忆输入!)

- (NSInteger)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    return rowHeight;


- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
    [super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration];

    rowHeight = (UIInterfaceOrientationPortrait == interfaceOrientation) ? 100 : 200;
    [tableView reloadData];

【讨论】:

先生。 deanWombourne,我爱你!工作!我现在正在阅读旋转内部原理,以实际弄清楚为什么表被渲染两次(好像进行了两次 reloadData 调用)。

以上是关于heightForRowAtIndexPath 总是被调用两次的主要内容,如果未能解决你的问题,请参考以下文章

TableView - heightForRowAtIndexPath 没有被调用

如何在 heightForRowAtIndexPath 中获取 UITableViewCell?

UITableView 中的 heightForRowAtIndexPath 都有哪些替换选项?

iOS 触发单格 tableView:heightForRowAtIndexPath:

如何在 heightForRowAtIndexPath 中获取单元格?

iOS - heightForRowAtIndexPath 在滚动期间不会触发