我很难理解UITableViewController的流程。基本上这是我的结构:
我有一个tableViewController,它当然包含一个tableView。在这里,我使用getCellContentView和cellForRowAtIndexPath来完成与我的单元格相关的所有工作。我的手机有几个带有自己框架的UILabel,每个方向一个。我检测并执行所有方向更改并正确地重绘帧。没问题。到目前为止一切都很好。
现在我需要heightForRowAtIndexPath为横向返回100,并为纵向指示200。我的问题是,当我在其中进行NSLog时,在旋转tableView时,无论出于何种原因,该方法都会被调用两次。任何人都知道为什么方法在旋转时被触发两次?我认为-reloadData可能是问题,我验证了我是否以某种方式在旋转时调用-reloadData,但是没有。我只在willRotateToInterfaceOrientation方法中调用-reloadData一次,而在代码中没有其他地方调用它(除了第一个viewDidLoad调用之外)。
为什么在每个旋转事件中都会调用heightForRowAtIndexPath两次?当旋转开始时,似乎heightForRowAtIndexPath也无法正确确定方向。我使用statusbar orientation属性检查insideForRowAtIndexPath内部是否返回适当的单元格高度。任何帮助都会很棒!
答案 0 :(得分:0)
谁在乎它被召唤的次数:)
你对heightForRowAtIndex的实现应该足够快,以至于表视图可以随时调用它并且无关紧要。
但是,如果我不得不推测,旋转分两个阶段完成(在UIViewController文档中查看didAnimateFirstHalfOfRotationToInterfaceOrientation:等等。)你不知道在rotatino期间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];
}