如果用户正在滚动,则禁用UICollectionView中的自动滚动

时间:2018-04-12 10:33:42

标签: ios uicollectionview swift4

我已经实现了一个水平UICollectionView,它会在3秒后自动滚动到下一个单元格。

一切都按预期工作,但我遇到了一个问题。

由于函数在3秒后自动触发,因此NSTimer如果两者同时发生,则与用户的滚动一致。

示例:

用户在3秒钟功能触发的同时向左(向后)滚动,这将向右滚动(下一个单元格)。

我想知道是否有办法说,如果用户自己滚动则禁用自动滚动,并在几秒钟后重新启用它,如果用户停止滚动。

这是我的代码:

override func viewDidLoad() {
    super.viewDidLoad()
    startTimer()
}

fileprivate func startTimer() {
    Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(scrollToNextCell), userInfo: nil, repeats: true)
}

@objc fileprivate func scrollToNextCell() {
    let cellSize = CGSize(width: width, height: height)
    let contentOffset = collectionView.contentOffset
    if collectionView.contentSize.width <= collectionView.contentOffset.x + cellSize.width {
        let rect = CGRect(x: 0, y: 0, width: cellSize.width, height: cellSize.height)
        collectionView.scrollRectToVisible(rect, animated: false)
    } else {
        let rect = CGRect(x: contentOffset.x + cellSize.width, y: 0, width: cellSize.width, height: cellSize.height)
        collectionView.scrollRectToVisible(rect, animated: true)
    }
}

这里最好的方法是什么?

一些事情:

集合视图检测用户滚动它会禁用startTimer()功能,然后如果用户停止滚动,则触发另一个等待Xn seconds再次触发startTimer()功能的函数。

然后,每次用户再次滚动时,它会再次禁用startTimer()和启用startTimer()的新功能(如果它正在运行)。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:3)

使用UIScrollViewDelegate

// called on finger up as we are moving
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
    Invalidate Timer.
}

// called when scroll view grinds to a halt  
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    Restart Timer.
}

替代方法

使用decelerating属性。如果用户没有拖动(触摸)但滚动视图仍在移动,则返回YES

@objc fileprivate func scrollToNextCell() {
  if (!collectionView.isDecelerating) {
     //your code here
  }
}