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

时间:2011-06-18 13:13:12

标签: ios ipad uitableview

在iPad上,当用户选择UIPopover中的单元格时,我会显示UITableView。单元格保持选中状态,直到弹出窗口被解除。

当用户将设备从纵向旋转到横向并且所选单元格位于屏幕的下半部分时,它将在旋转后消失,并且弹出结束指向另一个(无关紧要的)单元格。

当从纵向旋转到横向时,如何确保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 个答案:

答案 0 :(得分: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];
    }
}

答案 1 :(得分:2)

您已经知道选择了哪一行,对吗?您还知道设备方向何时更改,或者至少您可以知道,因为有UIViewController方法。您可以使用UITableView的-rectForRowAtIndexPath:方法获取所选行的矩形,并且可以使用UITcrollView的-scrollRectToVisible:animated:方法(UITableView继承)确保矩形保持可见。