如何滚动一个UITableView不包含任何行的部分?(How do I scroll a UITa

2019-08-22 13:50发布

在应用我的工作,我有一个普通样式的UITableView可以包含含零行的部分。 我希望能够滚动到使用本节scrollToRowAtIndexPath:atScrollPosition:动画:但我得到一个错误,当我试图滚动到这一部分由于缺乏子行。

苹果的日历应用程序是能够做到这一点,如果你看一下在列表查看日历,并有在你的日历今天没有事件,一个空的部分插入今天,你可以使用工具栏中的今天按钮滚动至在屏幕的底部。 至于我可以告诉苹果可能使用一个自定义的UITableView或他们正在使用私人API ...

我能想到的唯一解决方法是插入一个空UITableCell是0像素高和滚动到。 但它是我的理解,有不同高度的细胞是滚动的表现非常糟糕。 不过无论如何,我会试试,也许性能影响也不会太糟糕。

更新

由于似乎没有解决这个问题,我已经提交苹果一个bug报告。 //问题/ 6263339(:如果这会影响你,文件rdar的副本开放雷达链接)如果您希望此得到这个固定的速度更快。

更新#2

我有一个体面的解决办法对这个问题,看看我的回答如下。

Answer 1:

更新:貌似这个bug修复iOS中3.0。 您可以使用以下NSIndexPath滚动到包含0行的部分:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

我会离开这里我原来的解决办法的人还在使用2.x SDK中保持一个项目。


找到一份像样的解决方法:

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

代码,以便所需的部分是可见的,但不一定是在可见区域的顶部或底部上方将滚动的tableview。 如果你想滚动所以部分是在上面做到这一点:

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

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



Answer 2:

这是一个老问题,但苹果仍然没有任何添加这有助于或固定的崩溃的bug。其中,部分没有行。

对于我来说,我真的需要作出新的部分滚动至中间加时,所以我现在使用此代码:

if (rowCount > 0) {
    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder] 
                          atScrollPosition: UITableViewScrollPositionMiddle
                                  animated: TRUE];
} else { 
    CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder];
    // Try to get a full-height rect which is centred on the sectionRect
    // This produces a very similar effect to UITableViewScrollPositionMiddle.
    CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height;
    sectionRect.origin.y -= extraHeightToAdd * 0.5f;
    sectionRect.size.height += extraHeightToAdd;
    [self.tableView scrollRectToVisible:sectionRect animated:YES];
}

希望你喜欢它 - 它是基于迈克·埃克斯的代码,你可以看到,但会计算滚动到中间,而不是顶部。 感谢迈克 - 你是个明星。



Answer 3:

迅速的方法相同的:

if rows > 0 {
    let indexPath = IndexPath(row: 0, section: section)
    self.tableView.setContentOffset(CGPoint.zero, animated: true)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}

else {
    let sectionRect : CGRect = tableView.rect(forSection: section)
    tableView.scrollRectToVisible(sectionRect, animated: true)
}


Answer 4:

如果你的部分没有行使用此

let indexPath = IndexPath(row: NSNotFound, section: section)
tableView.scrollToRow(at: indexPath, at: .middle, animated: true)


Answer 5:

我认为,一个空行可能是去那里的唯一途径。 是否有可能重新设计的用户界面使得“空”行可以显示一些有用的东西?

我说试试吧,看看性能是什么样的。 他们给有关列表项使用透明的子视图很可怕的警告,我没有发现它要紧所有的东西,在我的应用程序。



文章来源: How do I scroll a UITableView to a section that contains no rows?