【问题标题】:iOS - scrollViewDidEndDecelerating runs for both scrollView and collectionViewiOS - scrollViewDidEndDecelerating 同时运行 scrollView 和 collectionView
【发布时间】:2017-11-11 08:00:03
【问题描述】:

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

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

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

它对scrollView 很有效,但问题是当我滚动到collectionView 时,它会声明并导致pageController 发生不必要的变化!

我该怎么办?

【问题讨论】:

    标签: ios objective-c swift scrollview collectionview


    【解决方案1】:

    首先你必须了解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
        }
    
    }
    

    谢谢。

    【讨论】:

    • 很好。编码愉快。
    • ;))) 你也是@Karthick
    【解决方案2】:
    if scrollView == yourScrollView{
        let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
        self.pageController.currentPage = Int(pageNumber)
    }
    

    检查运行该方法的实例是否真的是你的滚动视图

    【讨论】:

      【解决方案3】:

      您需要检查scrollViewDidEndDecelerating 中的scrollView 是滚动视图还是集合视图。 只需添加if scrollView == myScrollView,然后再执行您拥有的 2 行代码。

      你的代码应该是这样的

      功能

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

      【讨论】:

        【解决方案4】:

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

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

        yourScrollView.tag = 10
        

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

        func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        
            if scrollView.tag == 10 { 
              ///Your scrollview was scrolled
            } else {
              // Collection view was scrolled
            }
        
        }
        

        【讨论】:

        • @Dr.Arash 很高兴知道。随意支持答案:)
        猜你喜欢
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        • 1970-01-01
        • 2016-03-29
        • 2012-06-14
        • 1970-01-01
        • 2013-03-03
        相关资源
        最近更新 更多