自动滚动到顶部在 UITableView 中不起作用

Posted

技术标签:

【中文标题】自动滚动到顶部在 UITableView 中不起作用【英文标题】:Automatic scroll to top doesn't work in UITableView 【发布时间】:2010-11-12 18:23:37 【问题描述】:

通常当点击屏幕顶部时,tableview 会一直滚动到顶部。由于某种原因,这在我的一个视图控制器中不起作用。

层次结构如下:

UIView -> 网络视图 -> 表格视图 ----->搜索栏 搜索显示控制器。

我认为我已正确连接所有内容(数据源、委托、...)。我有一个类似的视图控制器,一切正常。唯一的区别似乎是 WebView,在点击并滚动到顶部工作的视图控制器中缺少它......

有什么想法吗?

最好的问候, 萨沙

【问题讨论】:

【参考方案1】:

您可能在视图层次结构中添加了一些视图,即 UIScrollView 或包含滚动视图(例如 UIWebViewUITextView)。当您点击状态栏时,ios 会搜索最顶部的滚动视图,并将 scrollsToTop 设置为 YES 并滚动到其顶部。

将此添加到您的课程中:

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

…然后打电话

[self disableScrollsToTopPropertyOnAllSubviewsOf:myAddedSubview];

解决问题并让您的表格视图再次滚动到顶部。

【讨论】:

非常感谢!我找不到为什么我的 tableview 没有向上滚动的问题,因为我只有两个 tableView,并且只有一个启用了 scrollToTop。使用此功能,我发现有第三个滚动视图,我将其添加为子视图。我完全忘记了那个! :) 谢谢!!!! 没想到UITextView的计数。谢谢。 这对于查找有问题的子视图非常有帮助,谢谢!【参考方案2】:

您需要在除一个可滚动视图之外的所有视图上禁用scrollsToTop。因为UITableViewUIScrollView 的后代,所以很容易做到。但是,如果你想在 webview 上禁用它,那就有点棘手了。这似乎有效:

[webView.subviews objectAtIndex:0].scrollsToTop = NO;

但这有点不确定,因为它在 webview 的未记录部分中四处游荡。如果 Apple 决定重新排列子视图,它可能会停止工作。

【讨论】:

我不能简单地枚举所有子视图,检查哪个是滚动视图的子类,然后在所有适当的子视图上使用上面的代码吗? 这是我所做的(即使 Apple 决定重新排列子视图,它甚至应该继续): for (int i=0; i 从 iOS 5 开始,UIWebView 的 -scrollView 属性 is exposed。【参考方案3】:

不知道 Apple 在抽什么,但从设计上讲,iPhone 上的行为与 iPad 明显不同。 Apple's documentation 确实包含如下“特别注意事项”说明...

在 iPhone 上,滚动到顶部手势无效 而不是屏幕上的一个滚动视图将 scrollsToTop 设置为 YES。

因此,在 iPhone 上,您必须确保只有一个 UIScrollView(或 UITableView/UICollectionView/UIWebView 等)具有其scrollsToTop = YES

由于 scrollsToTop 默认为 YES,因此您必须为 UIScrollView 显式设置 scrollsToTop = NO,当用户点击状态栏时您不想滚动。

【讨论】:

【参考方案4】:

显然,如果您在视图控制器中有多个滚动视图(在您的情况下为 WebView 和 TableView),则“点击状态栏滚动到顶部”将被禁用。

http://twitter.com/drance/status/2448035250438144

(Matt Drance 是前 iPhoneOS 开发布道者和现任 iOS 开发摇滚明星)

【讨论】:

【参考方案5】:

opyh 答案的 Swift 变体。为他点赞!

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) 
    for subview in view.subviews 
        if let scrollView = subview as? UIScrollView 
            (scrollView as UIScrollView).scrollsToTop = false
        
        self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView)
    

【讨论】:

【参考方案6】:

我只是想补充一下,如果您使用的是UITextView,则需要调整scrollsToTop的不是子视图,而是实际的UITextView,总之你需要这个代码:

[myTextView setScrollsToTop:FALSE];

这应该可以解决问题(此外,'disableScrollsToTopPropertyOnAllSubviewsOf' 函数在 UITextViews 上不起作用)。

希望这对某人有所帮助!

【讨论】:

【参考方案7】:

我在NIB 中只有一个表视图时遇到了这个问题。非常令人沮丧,直到我记得我以编程方式添加 UITextView 作为表视图标题。 UITextView 上的 scrollsToTop=NO 成功了。

【讨论】:

【参考方案8】:

在视图中的所有滚动视图上设置scrollsToTop = NO,您想要滚动到顶部的视图除外。这有助于系统找到正确的滚动视图。

【讨论】:

以上是关于自动滚动到顶部在 UITableView 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

滚动到顶部按钮在 IE 中不起作用

UITableView 在开始/结束更新调用调整高度后自动滚动到顶部

滚动到顶部按钮在子模板中不起作用

带有导航栏大标题的 UITableView 奇怪的滚动行为,顶部的弹跳效果在滚动到顶部时自动切断/生涩

iOS滚动视图禁用自动滚动到顶部

UITableView deleterows 滚动到顶部