iPad:如何保持选定的表格视图单元格在屏幕上显示

3
在iPad上,当用户选择UITableView中的单元格时,我会显示一个UIPopover。在弹出窗口关闭之前,单元格会保持选中状态。
当用户将设备从纵向旋转为横向时,如果所选单元格位于屏幕下部,则旋转后该单元格将消失,而弹出窗口则指向另一个(无关紧要的)单元格。
如何确保在从纵向旋转为横向时,UITableView中的选定单元格仍然保持在屏幕上?
更新:结合Caleb和kviksilver的代码,以下是可行的解决方案:
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    CGRect activeCellRect = [self.tableView rectForRowAtIndexPath:self.indexPath];
    if ((activeCellRect.origin.y + activeCellRect.size.height) >
        (self.view.frame.origin.y + self.view.frame.size.height))
    {
        // If a row ends up off screen after a rotation, bring it back
        // on screen.
        [self.tableView scrollToRowAtIndexPath:self.indexPath
                              atScrollPosition:UITableViewScrollPositionBottom
                                      animated:YES];
    }
}

更新2,关于重新定位 UIPopover: 在滚动命令之后需要向表格视图发送一个 reloadData 消息。然后 rectForRowAtIndexPath: 方法将正确报告单元格的位置(否则它将不会,因为它在滚动命令后没有正确更新)!

2个回答

4

当屏幕方向改变时,尝试检查indexPathsForVisibleRows以查看您的单元格是否可见,如果不可见,则使用scrollToRowAtIndexPath..类似以下内容:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    if (![[self.tableView indexPathsForVisibleRows] containsObject:[self.tableView indexPathForSelectedRow]]) {
        [self.tableView scrollToRowAtIndexPath:[self.tableView indexPathForSelectedRow] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }
}

感谢您的代码,但仍存在一个问题:[self.tableView indexPathsForVisibleRows]在旋转后不会返回行数组的“缩小”大小。不过,Caleb建议使用-rectForRowAtIndexPath:方法确实有效。 - user8472

2

你已经知道哪一行被选中了,对吧?同时,你也知道设备方向何时改变,或者至少你可以知道,因为UIViewController有专门的方法来处理它。你可以使用UITableView的-rectForRowAtIndexPath:方法获取被选中行的矩形区域,而且很容易通过UIScrollView的-scrollRectToVisible:animated:方法使这个矩形区域可见,因为UITableView继承了它。


继续kviksilver的方法,还有一个-scrollToNearestSelectedRowAtScrollPosition:animated:,听起来像是一步完成了我所描述的大部分功能。 - Caleb
我完全忘记了 scrollToNearestSelectedRowAtScrollPosition :-D。 - kviksilver
@kviksilver,你提到-scrollToRowAtIndexPath...之前,我完全忘了它了。团队合作;-) - Caleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接