当用户向我的列表中添加一个项目时,我想滚动到新行,突出显示它,然后选择它(这将推送一个新控制器)。关键部分是在推动新控制器之前等待滚动动画完成。
在这个答案中,我学习了如何使用动画委托等到滚动完成。
但是,如果插入行已经在屏幕上,表格视图将不会滚动并且该方法不会触发。
我如何才能等到滚动结束才推送新控制器,并处理不会启动滚动的情况 - 我如何区分每种情况?
当用户向我的列表中添加一个项目时,我想滚动到新行,突出显示它,然后选择它(这将推送一个新控制器)。关键部分是在推动新控制器之前等待滚动动画完成。
在这个答案中,我学习了如何使用动画委托等到滚动完成。
但是,如果插入行已经在屏幕上,表格视图将不会滚动并且该方法不会触发。
我如何才能等到滚动结束才推送新控制器,并处理不会启动滚动的情况 - 我如何区分每种情况?
尝试创建一个方法来查看是否需要滚动。如果不需要滚动,则立即调用推送,否则等待委托调用并推送。
- (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
从矩形的底部减去。如果您有静态高度行,代码不应该太粗糙。如果你有不同高度的行,它仍然可以工作,但它会涉及更多。
尽管如此,对于一些你认为会有一个简单答案的东西来说,似乎有很多代码。
检查给定行是否在表格视图中可见的最简单方法是这样的:
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
}