当用户将项目添加到我的列表中时,我想要滚动到新的一行,突出显示它,并选择它(它将推动一个新的控制器)。关键部分是在推动新控制器之前等待滚动动画完成。滚动完成后推送视图控制器
在this answer中,我学会了如何使用动画委托来等待滚动完成。
但是,如果插入行已经在scree上,则表格视图将不会滚动并且方法不会触发。
我该如何等待推动新的控制器直到滚动结束,并处理不会启动滚动的情况 - 以及如何分辨每种情况之间的区别?
当用户将项目添加到我的列表中时,我想要滚动到新的一行,突出显示它,并选择它(它将推动一个新的控制器)。关键部分是在推动新控制器之前等待滚动动画完成。滚动完成后推送视图控制器
在this answer中,我学会了如何使用动画委托来等待滚动完成。
但是,如果插入行已经在scree上,则表格视图将不会滚动并且方法不会触发。
我该如何等待推动新的控制器直到滚动结束,并处理不会启动滚动的情况 - 以及如何分辨每种情况之间的区别?
检查一个给定的行是否在你的表视图中可以看到最简单的方法是这样的:
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
}
尝试创建一个方法来查看是否需要滚动。如果不需要滚动,请立即调用推送,否则等待委托呼叫并推送。
- (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.y
和tableview.frame.size.height
来确定你的“可见矩形”。
然后为了说明顶部和底部的部分可见行,您可以将rowHeight-1
添加到矩形的顶部,并从矩形的底部减去rowHeight - 1
。如果你有静态高度的行,代码不应该太粗糙。如果你有不同的高度行,它仍然可以工作,但会涉及更多。
尽管如此,它看起来像很多代码,你会认为会有一个简单的答案。
感谢。这种方法唯一的问题是根据tableview,部分可见行是'可见的',所以不会触发滚动。使用普通的滚动方法,tableview可以正确识别出部分行,并将其向上/向下滚动一下以放在屏幕上。 –
这对我来说破解了,除了我认为参数应该颠倒吗? –
哎呀,你是对的。当我第一次写我使用CGRectIntersectsRect并且在我替换它时没有改变顺序。固定。 –