通过点击状态栏滚动到顶部 TableView 不起作用(有许多子视图)SWIFT

Posted

技术标签:

【中文标题】通过点击状态栏滚动到顶部 TableView 不起作用(有许多子视图)SWIFT【英文标题】:Scroll to top TableView by tapping status bar not work (with many subviews) SWIFT 【发布时间】:2016-02-05 00:40:30 【问题描述】:

我有很多视图,每个视图都有很多子视图。 我试图为每个子视图指定

scrollsToTop = false

但是当我按下状态栏时,我的TableView 没有滚动到顶部。 我想我错过了一些观点......

我知道有一个类似的帖子,但它没有回答 (UITableView scroll to top when tapping status bar at top of the screen)

所以我决定实现这个功能:

override func viewDidLoad()    

    super.viewDidLoad()

    checkForScrollViewInView(self.view)

    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.tableView.scrollsToTop = true


func checkForScrollViewInView(view:UIView) 
    for subview in view.subviews as [UIView] 

        if subview.isKindOfClass(UITextView) 
            (subview as! UITextView).scrollsToTop = false
        

        if subview.isKindOfClass(UIScrollView) 
            (subview as! UIScrollView).scrollsToTop = false
        

        if subview.isKindOfClass(UITableView) 
            (subview as! UITableView).scrollsToTop = false
        

        if (subview.subviews.count > 0) 
            self.checkForScrollViewInView(subview)
        
    

但它也不起作用。我不知道我错过了什么。

【问题讨论】:

【参考方案1】:

您可能会遇到 2 个问题:

    您有多个UIScrollView 实例。您应该为父 UIScrollView 或从它继承的对象(如 UITableViewUICollectionView)禁用 scrollsToTop(例如 viewDidLoad 中的 self.collectionView?.scrollsToTop = false)。

来自苹果scrollViewShouldScrollToTop(_:)

如果委托未实现此方法,则假定为 true。要使滚动到顶部手势(点击状态栏)生效,UIScrollView 的 scrollsToTop 属性必须设置为 YES。

    如果您的层次结构是高度自定义的方法scrollViewShouldScrollToTop 将不会被调用。你应该检查为什么会发生。否则你将不得不做一些肮脏的工作:添加一些手势并处理它们。

有趣的链接:

Scroll to top of UITableView by tapping status bar

Why doesn't UIScrollView/UITableview respond to taps on the status bar, and scroll to the top?

https://developer.apple.com/library/prerelease/ios//documentation/UIKit/Reference/UIScrollViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIScrollViewDelegate/scrollViewShouldScrollToTop:

【讨论】:

【参考方案2】:

好的,我找到了为什么我的 tableview 不会滚动!

我只在我的表视图的视图控制器的 viewDidLoad 中调用了我的 checkForScrollViewInView() 函数。为了禁用每个子视图的 scrollToTop。

但我忘记了我还有另一个“活动”视图控制器......在我的应用程序中,我有一个左侧菜单,可以打开滑动。在左侧菜单的视图控制器中调用 checkForScrollViewInView() 解决了我的问题。

func checkForScrollViewInView(view:UIView) 

    for subview in view.subviews as [UIView] 

        if subview.isKindOfClass(UITextView) 
            (subview as! UITextView).scrollsToTop = false
        

        if subview.isKindOfClass(UIScrollView) 
            (subview as! UIScrollView).scrollsToTop = false
        

        if subview.isKindOfClass(UITableView) 
            (subview as! UITableView).scrollsToTop = false
        

        if (subview.subviews.count > 0) 
            self.checkForScrollViewInView(subview)
        
    

【讨论】:

以上是关于通过点击状态栏滚动到顶部 TableView 不起作用(有许多子视图)SWIFT的主要内容,如果未能解决你的问题,请参考以下文章

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

单击 tableview 单元格时滚动到顶部搜索栏控制器

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

点击状态栏时将所有滚动视图滚动到顶部

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

如何在 iOS 11 中像点击状态栏一样调用缓慢滚动到顶部的动画?