如何将UITableView滚动到不包含任何行的部分?

时间:2020-03-06 14:59:55  来源:igfitidea点击:

在我正在处理的应用程序中,我有一个普通样式的UITableView,可以包含一个包含零行的部分。我希望能够使用scrollToRowAtIndexPath:atScrollPosition:animated滚动到此部分:但是由于缺少子行,在尝试滚动到此部分时出现错误。

Apple的日历应用程序可以执行此操作,如果我们在列表视图中查看日历,并且今天的日历中没有事件,则今天插入一个空白部分,我们可以使用工具栏中的"今天"按钮滚动到该日历部分在屏幕底部。据我所知,苹果可能正在使用自定义的UITableView,或者他们正在使用私有API ...

我能想到的唯一解决方法是在0像素高的位置插入一个空的UITableCell并滚动到该位置。但是我的理解是,拥有不同高度的单元确实不利于滚动性能。无论如何,我还是会尝试一下,也许性能不会太差。

更新

由于似乎无法解决此问题,因此我向Apple提交了错误报告。如果这也影响到我们,请提交一份rdar:// problem / 6263339(打开Radar链接)的副本,如果我们希望这样做可以更快地解决此问题。

更新#2

对于这个问题,我有一个不错的解决方法,请在下面查看我的答案。

解决方案

我认为空白行可能是到达那里的唯一方法。是否可以重新设计UI,以使"空"行可以显示有用的内容?

我说尝试一下,看看性能如何。他们对在列表项中使用透明子视图给出了非常可怕的警告,但我发现这在我的应用程序中并没有那么重要。

更新:看来此错误已在iOS 3.0中修复。我们可以使用以下NSIndexPath滚动到包含0行的部分:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

对于任何仍在使用2.x SDK维护项目的人,我将在这里保留原始解决方法。

找到了一个不错的解决方法:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
[tableView scrollRectToVisible:sectionRect animated:YES];

上面的代码将滚动表格视图,以便所需的部分可见,但不一定位于可见区域的顶部或者底部。如果要滚动使该部分位于顶部,请执行以下操作:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
sectionRect.size.height = tableView.frame.size.height;
[tableView scrollRectToVisible:sectionRect animated:YES];

根据需要修改sectionRect,将所需的部分滚动到可见区域的底部或者中间。