iOS - scrollViewDidEndDecelerating 为 scrollView 和 collectionView 运行

iOS - scrollViewDidEndDecelerating runs for both scrollView and collectionView

我有一个 VC,其中包含一个 collectionView 和一个 scrollView。我把这段代码通过在 scrollView 中滚动来更改 pageController 的当前页面:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

    let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
    self.pageController.currentPage = Int(pageNumber)
}

它对 scrollView 很好用,但问题是当我在 collectionView 中滚动时,它会声明并导致 pageController 中不需要的更改!

我该怎么办?

首先,您必须了解有关 UICollectionView 的一些细节。 UICollectionViewUIScrollView 的子类。这就是为什么它需要滚动(滚动集合视图和滚动滚动视图)。你可以这样做来区分它是什么类型的滚动,

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

    if scrollView == "Your scrollView outlet name" { // Scroll view
        let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
        self.pageController.currentPage = Int(pageNumber)
    } else {
      // Collection view
    }

}

谢谢。

if scrollView == yourScrollView{
    let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
    self.pageController.currentPage = Int(pageNumber)
}

检查实例运行方法是否真的是你的scrollView

您需要检查 scrollViewDidEndDecelerating 中的 scrollView 是滚动视图还是 collection 视图。 只需在执行您拥有的 2 行代码之前添加一个 if scrollView == myScrollView

您的代码应该如下所示

函数

scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    if scrollView == myScrollView {
        let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
        self.pageController.currentPage = Int(pageNumber)
    }
}

除了上面发布的答案,您还可以使用视图的标签 属性。

只需在 xib 中或通过代码为您的滚动视图分配一个标签 (Int)。

yourScrollView.tag = 10

并在滚动视图委托方法中检查此标记:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

    if scrollView.tag == 10 { 
      ///Your scrollview was scrolled
    } else {
      // Collection view was scrolled
    }

}