滚动完成后推动视图控制器

时间:2013-01-08 19:02:03

标签: iphone ios cocoa-touch uitableview uiviewcontroller

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

this answer中,我学习了如何使用动画委托等待滚动完成。

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

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

2 个答案:

答案 0 :(得分: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用于数据呈现。

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

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

所有人都说,看起来很多代码都是你认为会有简单答案的。

答案 1 :(得分: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
}