通过点击状态栏滚动到 UITableView 的顶部

Posted

技术标签:

【中文标题】通过点击状态栏滚动到 UITableView 的顶部【英文标题】:Scroll to top of UITableView by tapping status bar 【发布时间】:2011-11-02 05:09:24 【问题描述】:

我知道有大量代码可以将 tableview 滚动到顶部,但我想在点击顶部状态栏时执行此操作,就像在 Apple 的本机应用程序中一样。这可能吗?

【问题讨论】:

我测试过(ios 8),发现Zane Claes checklist中的“3”项是不需要的。 【参考方案1】:

您可以免费获得这个,但您应该检查您的UITableViewscrollsToTop 属性是否为YES。

当你有一个 UIScrollView(或像 UITextView 这样的后代类)对象嵌入另一个 UIScrollView 类(如 UITableView)时,这不起作用。在这种情况下,将嵌入式UIScrollView 类上的scrollsToTop 设置为NO。然后点击状态栏行为将起作用。

【讨论】:

我已经尝试了你的建议——将嵌入式滚动视图的 scrollsToTop 设置为 NO——但状态栏点击仍然不会导致顶部滚动视图滚动到顶部。 这非常有效。 @CharlieMezak 也许您在屏幕上有多个嵌入式滚动视图。除了视图层次结构顶部的滚动视图之外,它们都必须设置为 NO。 在我的情况下,我在垂直滚动的表格视图中有一些水平滚动的集合视图,将 scrollsToTop 设置为 NO 以使所有集合视图都有效。看起来不直观,但确实有效! @CharlieMezak 请注意,scrollsToTop = NO 规则必须应用于窗口中的所有视图。例如,如果您有侧边菜单。 这发生在我的 UICollectionView 中。我在每个 UICollectionViewCell 中有一个横向滚动的 UIScrollView。将 scrollsToTop = NO 设置为单元格的 scrollView 可解决此问题。谢谢【参考方案2】:

如果您来自 Google 并需要一份完整的清单:

    检查您是否在 UITableView 上设置了 scrollsToTop=YES(根据 Mark 的建议) 确保您在窗口中的所有其他 UITableViews / UIScrollViews / UITextViews 上设置了 scrollsToTop=NO,这样它们就不会拦截点击。我发现自己多次打印出窗口中的所有视图来调试它... 确保您的表格视图位于窗口内的 0/0(x/y 坐标) - 这是系统知道它应该传递消息的方式

【讨论】:

如果它位于窗口内低于 0,0 的子视图控制器中怎么办? 这在您使用多个 uiwebviews 时很有用,因为您需要将非活动 webviews 的 scrollstotop 属性设置为 NO 感谢您提供这份完整的清单。在我的代码中搜索 UITextView 并找到导致问题的代码。 正如@shim 所问 - @Zane/@Kyle - 如果它位于窗口内低于 0,0 的子视图控制器中怎么办?【参考方案3】:

使用其他答案中给出的信息,我将以下代码添加到我的 UITableViewController 中让它工作:

- (void)viewDidLoad [超级视图DidLoad]; for (UITextView *view in self.view.subviews) if ([查看 isKindOfClass:[UITextView 类]]) view.scrollsToTop = 否; self.tableView.scrollsToTop = 是;

这会查看 UITableViewController 层次结构中的所有视图,并关闭所有拦截触摸事件的 UITextView 上的 scrollsToTop。然后,确保 tableView 仍然会接收到触摸。

您可以修改它以遍历其他可能被拦截的 UITableViews / UIScrollViews / UITextViews。

希望这会有所帮助!

【讨论】:

实际上你可以在你的代码中将 UITextView 更改为 UIScrollView,它会捕获所有 UITableViews 和 UITextViews,因为它们都是 UIScrollView 的子类。【参考方案4】:

我遇到了同样的问题,但通过以下步骤解决了:

    为要滚动到顶部的表格视图设置 scrollsToTop = YES。 为所有其他表格视图或集合视图或滚动视图设置 scrollsToTop = NO。 如果您的任何 tableview 单元格具有 collection view 。确保您也将集合视图的 scrollsToTop 设置为 NO。

如果您的视图控制器/导航控制器作为子视图添加到另一个视图控制器上,请确保将其设置为子控制器。

【讨论】:

调用addChildViewController() 是缺失的部分。谢谢!【参考方案5】:

我知道这是一个很老的问题,但希望这能有所帮助。按照@MarkGranoff 所说,如果多个 UIScrollView 或其子类将其设置为 YES(默认值),则 scrollsToTop 不起作用,可能值得进行健全性检查,以检查谁实际上在搞乱这种行为。下面的简单方法遍历视图的子视图并记录视图中所有 UIScrollView 的 scrollsToTop 值。最好在您的 viewDidAppear 方法中调用。

- (void)checkForScrollViewInView:(UIView *)view 
    for (UIView *subview in [view subviews]) 
        if ([subview isKindOfClass:[UIScrollView class]]) 
            NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
        
        if (subview.subviews.count > 0) 
            [self checkForScrollViewInView:subview];
        
    

这确实只是一个调试代码。一旦找到每个 UIScrollView 子类的 scrollsToTop 值,只需确保只有一个设置为 YES。

【讨论】:

【参考方案6】:

就像 Mark 说的,你只能有一个 UIScrollView 的子类(通常是表格视图),它的 scrollsToTop 属性设置为 TRUE。您可能还有其他人,通常是 UITextView 在您的视图中。只需将他们的 scrollsToTop 属性设置为 FALSE 即可。

【讨论】:

这是我的问题,我在同一个屏幕上有 2 个表格视图,每个视图都有一个插座,所以只需将一个设置为 false 就可以了,谢谢!【参考方案7】:

关于 UIScrollView 头文件:

// 当用户点击状态栏时,最靠近状态栏的触摸下方的滚动视图将滚动到顶部,但只有当它的scrollsToTop属性为YES时,它的delegate才不会返回NO shouldScrollViewScrollToTop,它还没有在顶部。 // 在 iPhone 上,只有当屏幕上有一个带有scrollsToTop == YES 的滚动视图时,我们才会执行此手势。如果找到多个,则不会滚动任何一个。

【讨论】:

【参考方案8】:

例如,如果您有像这样的标签的表格视图和滚动视图

你应该在viewDidLoad做这样的事情

self.tableView.scrollsToTop = true
self.tagsView.scrollsToTop = false

【讨论】:

【参考方案9】:

可以加载多个 UIScrollView 后代,例如:在包含 UITableViews 的每个页面上都有一个 UIPageViewcontroller。

scrollsToTop 属性默认为 true

所以除了处理嵌套的 UIScrollViews 的 scrollsToTop 属性之外,你还应该做以下事情:

//When the view is loaded disable scrollsToTop, this view may not be the visible one
override func viewDidLoad() 
    super.viewDidLoad()
    ...
    tableView.scrollsToTop = false


//Now it's time to enable scrolling, the view is guaranteed to be visible
override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    tableView.scrollsToTop = true


//Do not forget to disable scrollsToTop, making other visible UIScrollView descendant be able to be scrolled to top
override func viewWillDisappear(_ animated: Bool) 
    super.viewWillDisappear(animated)
    self.tableView.scrollsToTop = false

这样只有一个*** UITableView 的 scrollsToTop 会被设置为 true。

【讨论】:

以上是关于通过点击状态栏滚动到 UITableView 的顶部的主要内容,如果未能解决你的问题,请参考以下文章

如何使按下状态栏滚动到任何 UITableView 的顶部?

搜索结果在状态栏下方明显滚动

仅在 iPhone 5C 上滚动 UITableView 会导致异常和崩溃

再次点击当前标签栏时如何在 UITableView 中滚动到顶部?

当 UISearchBar 处于活动状态时,滚动到 UITableView 应用程序会崩溃

使用大标题时 iOS 11 滚动到顶部无法正常工作