无法在iOS7上实现scrollsToTop功能

24

我在我的最新应用中针对iOS7进行了定向开发,但是点击状态栏似乎无法将tableView或collectionView滚动到顶部。

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

我知道苹果在iOS7中显着改变了状态栏,但这些更改是否破坏了scrollsToTop功能?

更新

回应答案中的评论,我测试以确保我的collectionView确实是屏幕上唯一的scrollView,结果它就是唯一的。

(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 NavigationController,其中navigationBar是透明的,并在我的collection/tableViews滚动到下面时应用模糊效果。

更新 #3

找到问题所在了。原来屏幕上有不止一个scrollView。我的应用程序在主部分下面有一个左侧抽屉菜单,该菜单有一张选项的tableView。我只需设置self.menuTable.scrollsToTop = false即可使其在整个应用程序中按预期工作。无需实现scrollView Delegate方法或其他任何内容。


你需要设置类似于 self.tableView.scrollEnabled = YES; 这样的东西吗?但是针对的是tableview。 - DogCoffee
在第三次更新中提出的建议非常好,我已经以同样的方式解决了这个问题。但奇怪的是,在没有第三次更新修复的情况下,它在iOS8上运行正常,但在iOS7上却不行。 - MANIAK_dobrii
6个回答

23

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

您还可以实现scrollViewShouldScrollToTop:协议方法,并且如果传入的滚动视图与您想要滚动到顶部的视图相等,则返回YES

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

这两个视图控制器的视图是否同时可见? - Greg
抱歉造成困惑。这是应用程序的两个完全不同的部分。 - djibouti33
1
屏幕上是否还有其他滚动视图(或滚动视图子类,如表格视图或集合视图)?如苹果文档所述,“在 iPhone 上,如果屏幕上有多个已将 scrollsToTop 设置为 YES 的滚动视图,则返回顶部手势无效。” - Greg
啊哈 - 我曾经在我构建的一个应用程序上遇到了完全相同的问题(带有表视图的滑动抽屉和带有表视图的主视图)。很高兴现在它已经可以工作了! - Greg
让我们在聊天室里继续这个讨论 - Greg
显示剩余2条评论

11
短答案是,在iOS7中没有任何不同。只要没有多个UIScrollView加载,当用户点击状态栏时,您的tableView或collectionView将滚动到顶部。关键在于已经加载;另一个scrollView不一定必须在屏幕上与已经存在的scrollView冲突。
现在很流行左/右侧的滑动抽屉,这就是我的问题所在。我有一个包含导航选项的菜单,这些都由UITableView持有。我必须确保在让其他部分工作之前设置menuTable.scrollsToTop = false

是的!这对我有用!:D - Mihai Fratu
谢谢!你救了我的一天 :) - Nikant
这肯定能节省我的时间。 - pkc456

7

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


4

对于其他人:

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

如果您找不到滚动视图,您始终可以插入UITableView测试表格,立即在应用程序启动时检查它是否向顶部滚动, 然后加载更多和更多的视图,直到测试表格停止向顶部滚动。


4
如果您的表格单元格是动态的,请删除以下内容:
- (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];

-2

这个方法对我总是有效:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接