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

cmi*_*mii 3 scroll statusbar uitableview ios swift

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

scrollsToTop = false
Run Code Online (Sandbox Code Playgroud)

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

SB

我知道有一个类似的帖子,但它没有回答(点击屏幕顶部的状态栏时 UITableView 滚动到顶部

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

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它也不起作用。我不知道我想念什么。

Szu*_*Szu 5

您可能会遇到两个问题:

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

来自苹果 scrollViewShouldScrollToTop(_:)

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

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

有趣的链接:

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

为什么 UIScrollView/UITableview 不响应状态栏上的点击,并滚动到顶部?

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


cmi*_*mii 5

好的,我找到了为什么我的 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)