0

当用户向我的列表中添加一个项目时,我想滚动到新行,突出显示它,然后选择它(这将推送一个新控制器)。关键部分是在推动新控制器之前等待滚动动画完成。

这个答案中,我学习了如何使用动画委托等到滚动完成。

但是,如果插入行已经在屏幕上,表格视图将不会滚动并且该方法不会触发。

我如何才能等到滚动结束才推送新控制器,并处理不会启动滚动的情况 - 我如何区分每种情况?

4

2 回答 2

1

尝试创建一个方法来查看是否需要滚动。如果不需要滚动,则立即调用推送,否则等待委托调用并推送。

- (BOOL)isSrollingingNeededForIndexPath:(NSIndexPath *)indexPath {
    NSArray *visibleIndices = [self.tableView indexPathsForVisibleRows];
    for (NSIndexPath *visibleIndexPath in visibleIndices)
        if ([indexPath compare:visibleIndexPath] == NSOrderedSame)
            return NO;
    return YES;
}

编辑:好点。由于indexPathsForVisibleRows用于数据渲染。

indexPathsForRowsInRect您可以在使用content.offset.ytableview.frame.size.height确定“可见矩形”的位置进行基本相同的操作。

然后考虑顶部和底部的部分可见行,您可以添加rowHeight-1到矩形的顶部并rowHeight - 1从矩形的底部减去。如果您有静态高度行,代码不应该太粗糙。如果你有不同高度的行,它仍然可以工作,但它会涉及更多。

尽管如此,对于一些你认为会有一个简单答案的东西来说,似乎有很多代码。

于 2013-01-08T20:12:18.113 回答
1

检查给定行是否在表格视图中可见的最简单方法是这样的:

if (!CGRectContainsRect([self.tableView bounds], [self.tableView rectForRowAtIndexPath:indexPath])
{
    // the row is partially outside the table view’s boundaries and needs to be scrolled for full visibility
}
else
{
    // the row is within the boundaries and does not need to be scrolled
}
于 2013-01-08T23:38:02.017 回答