我已经实现了一个水平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()
的新功能(如果它正在运行)。
我怎样才能做到这一点?
答案 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
}
}