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

Scroll to top TableView by tapping status bar not work (with many subviews) SWIFT

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

scrollsToTop = false

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

我知道有一个类似的 post 但它没有回答 (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. 您有多个 UIScrollView 实例。您应该为父 UIScrollView 或从它继承的对象(如 UITableViewUICollectionView 禁用 scrollsToTop(例如 viewDidLoad 中的 self.collectionView?.scrollsToTop = false) ).

来自苹果 scrollViewShouldScrollToTop(_:)

If the delegate doesn’t implement this method, true is assumed. For the scroll-to-top gesture (a tap on the status bar) to be effective, the scrollsToTop property of the UIScrollView must be set to YES.

  1. 如果您的层次结构是高度自定义的,方法 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:

好的,我找到了 table 视图无法滚动的原因!

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

但我忘了我还有另一个 "active" 视图控制器...在我的应用程序中,我有一个左侧菜单,可以打开滑动。在左侧菜单的视图控制器中调用 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)
        }
    }
}