自动滚动到顶部在 UITableView 中不起作用
Posted
技术标签:
【中文标题】自动滚动到顶部在 UITableView 中不起作用【英文标题】:Automatic scroll to top doesn't work in UITableView 【发布时间】:2010-11-12 18:23:37 【问题描述】:通常当点击屏幕顶部时,tableview 会一直滚动到顶部。由于某种原因,这在我的一个视图控制器中不起作用。
层次结构如下:
UIView -> 网络视图 -> 表格视图 ----->搜索栏 搜索显示控制器。
我认为我已正确连接所有内容(数据源、委托、...)。我有一个类似的视图控制器,一切正常。唯一的区别似乎是 WebView,在点击并滚动到顶部工作的视图控制器中缺少它......
有什么想法吗?
最好的问候, 萨沙
【问题讨论】:
【参考方案1】:您可能在视图层次结构中添加了一些视图,即 UIScrollView 或包含滚动视图(例如 UIWebView
或 UITextView
)。当您点击状态栏时,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
。因为UITableView
是UIScrollView
的后代,所以很容易做到。但是,如果你想在 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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 在开始/结束更新调用调整高度后自动滚动到顶部