当用户将一个项目添加到我的列表中时,我想滚动到新行,突出显示它,然后选择它(这将推送一个新的控制器)。关键部分是在推动新控制器之前等待滚动动画完成。
在this answer中,我学习了如何使用动画委托等待滚动完成。
但是,如果插入行已经在scree上,则表视图将不会滚动,并且该方法不会触发。
我如何等待推动新控制器直到滚动结束,并处理不会启动滚动的情况 - 我如何区分每种情况?
答案 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
用于数据呈现。
您可以使用indexPathsForRowsInRect
和content.offset.y
来tableview.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
}