iPad:在屏幕上保留选定的表格视图单元格

Posted

技术标签:

【中文标题】iPad:在屏幕上保留选定的表格视图单元格【英文标题】:iPad: Keeping a selected table view cell on screen 【发布时间】:2011-06-18 13:13:12 【问题描述】:

在 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: 方法将正确报告单元格的位置(否则它不会,因为它在滚动命令后没有正确更新)!

【问题讨论】:

【参考方案1】:

在方向更改时尝试检查 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: 方法确实有效。【参考方案2】:

您已经知道选择了哪一行,对吧?您还知道设备方向何时更改,或者至少您可以知道,因为有 UIViewController 方法可以做到这一点。您可以使用 UITableView 的 -rectForRowAtIndexPath: 方法获取选定行的矩形,并且使用 UITableView 继承的 UIScrollView 的 -scrollRectToVisible:animated: 方法很容易确保矩形保持可见。

【讨论】:

继 kviksilver 的方法之后,还有一个 -scrollToNearestSelectedRowAtScrollPosition:animated: 听起来就像我在一个步骤中描述的大部分内容一样。 我完全忘记了 scrollToNearestSelectedRowAtScrollPosition :-D @kviksilver,我完全忘记了-scrollToRowAtIndexPath...,直到你提到它。团队合作。 ;-)

以上是关于iPad:在屏幕上保留选定的表格视图单元格的主要内容,如果未能解决你的问题,请参考以下文章

修改或删除主从 ipad 应用程序中的表格视图单元格

iOS/xCode 7 表格单元格不在 iPad 上绘图

如何在另一个视图控制器上向 UInavigationcontroller 显示完整的选定表格单元格

在屏幕上滚动和返回时如何保留 UITableViewCell 的选定状态

当单元格滚动回视图时表格崩溃

重新启动应用程序时恢复自定义表格视图单元格