无法在 iOS7 上获取滚动到顶部



我在最新的应用程序中以iOS7为目标,点击状态栏似乎没有将tableView或collectionView滚动到顶部。

我已经设置了self.tableView.scrollsToTop = true,但仍然没有任何反应。

我知道苹果在iOS7中对状态栏进行了重大更改,但是这些更改是否破坏了scrollsToTop功能?

更新

为了回应其中一个答案中的评论,我进行了测试,以确保我的集合视图确实是屏幕上唯一的滚动视图,它是:

(lldb) po [self.view recursiveDescription]
<UIView: 0x1092ddf0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x109357e0>>
   | <UICollectionView: 0x11351800; frame = (0 0; 320 568); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x10966080>; layer = <CALayer: 0x109623a0>; contentOffset: {0, -64}> collection view layout: <UICollectionViewFlowLayout: 0x10940a70>
   |    | <UIImageView: 0x10965fa0; frame = (0 564.5; 320 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x10965ee0>> - (null)
   |    | <UIImageView: 0x10948f60; frame = (316.5 561; 3.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x10966030>> - (null)

更新 #2

不确定这是否重要,但我使用的是标准的 iOS7 导航控制器,其中导航栏是透明的,并在下面滚动时对我的集合/表视图应用模糊。

更新 #3

想通了。事实证明,屏幕上确实有多个滚动视图。我的应用在应用的主要部分下方有一个左抽屉菜单,该菜单有一个用于选项的 tableView。我只是设置了self.menuTable.scrollsToTop = false,在应用程序的其余部分,一切都按预期工作。不必实现 scrollView 委托方法或任何东西。

屏幕上是否有多个滚动视图/表格视图/集合视图?如果是这样,则其中只有一个可以scrollsToTop设置为 YES ,否则 iOS7 不会将它们中的任何一个滚动到顶部。

您还可以实现 UIScrollViewDelegate 方法scrollViewShouldScrollToTop:,如果传入的滚动视图等于要滚动到顶部的视图,则返回 YES:

- (BOOL) scrollViewShouldScrollToTop:(UIScrollView*) scrollView {
    if (scrollView == self.myTableView) {
        return YES;
    } else {
        return NO;
    }
}

简短的回答是iOS7没有什么不同。只要加载的 UIScrollView 不超过一个,当用户点击状态栏时,您的 tableView 或集合视图就会滚动到顶部。此处的密钥已加载;另一个滚动视图不一定必须在屏幕上才能与另一个滚动视图冲突。

如今,左/右滑动抽屉非常流行,这就是我问题的原因。我有一个包含我的导航选项的菜单,这些选项都由 UITableView 保存。我必须确保我设置了menuTable.scrollsToTop = false,然后才能在应用程序的其他部分中正常工作。

我的问题是我有一个UITextViewscrollsToTop设置为 YES ,所以我的UITableView没有响应手势。简而言之,检查所有其他可滚动视图。

对于其他人:

请记住,您正在搜索的滚动视图也可以是UIWebView。不仅仅是UITableView。另一个重要的事情是,它不仅与可见的滚动视图有关,而且与加载的滚动视图有关。

如果您没有找到滚动视图,您可以随时插入UITableView测试表,在应用程序启动时立即检查它是否滚动到顶部,然后加载越来越多的视图,直到测试表停止滚动到顶部。

如果表格单元格是动态的,请删除以下内容:

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
    return YES;
}

创建一个新函数,如下所示:

- (void) disableScrollsToTopPropertyOnAllSubviewsOf:(UIView *)view {
    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UIScrollView class]]) {
            ((UIScrollView *)subview).scrollsToTop = NO;
        }
        [self disableScrollsToTopPropertyOnAllSubviewsOf:subview];
    }
}

- (void)viewDidLoad中调用上述函数

[self disableScrollsToTopPropertyOnAllSubviewsOf:self.view];

现在为您的表格视图启用 ScrollsToTop,如下所示:

[myTableView setScrollsToTop:YES];

这总是对我有用:

[self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

最新更新