Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果用户正在滚动,则禁用UICollectionView中的自动滚动_Ios_Uicollectionview_Swift4 - Fatal编程技术网

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

Ios 如果用户正在滚动,则禁用UICollectionView中的自动滚动,ios,uicollectionview,swift4,Ios,Uicollectionview,Swift4,我已经实现了一个水平UICollectionView,它会在3秒钟后自动滚动到下一个单元格 一切正常,但我遇到了一个问题 由于该函数在3秒钟后自动启动,如果同时出现,则会使用NSTimer与用户的滚动条合并 例如: 用户正在向左(向后)滚动,同时启动3秒钟的函数,该函数将向右滚动(下一个单元格) 我想知道是否有办法,比如说,如果用户自己正在滚动,就禁用自动滚动,如果用户停止滚动,几秒钟后再重新启用 这是我的密码: override func viewDidLoad() { super.v

我已经实现了一个水平
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)
    }
}
override func viewDidLoad(){
super.viewDidLoad()
startTimer()
}
fileprivate func startTimer(){
Timer.scheduledTimer(时间间隔:3.0,目标:self,选择器:#选择器(scrollToNextCell),用户信息:nil,重复:true)
}
@objc fileprivate func scrollToNextCell(){
let cellSize=CGSize(宽度:宽度,高度:高度)
让contentOffset=collectionView.contentOffset

如果collectionView.contentSize.width使用
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.
}
替代方法

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

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

使用
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.
}
替代方法

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

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

哦..我不知道
减速
属性只在触摸屏上启动,因为它是自动滚动的,我想他们无论如何都会启动。我会试试你的解决方案,我会马上反馈。非常感谢你..我不知道
减速
属性只在触摸屏上启动,因为它是自动滚动的,我不知道我想他们无论如何都会开枪。我会试试你的解决方案,我会马上给你反馈。非常感谢