有没有一种更快的方法来检测UIScrollView的contentOffset /即使在高速下,UIPickerView如何触发反馈?

时间:2019-04-18 19:06:19

标签: uiscrollview uicollectionview uipickerview uiscrollviewdelegate

我有一个水平滚动的UICollectionView来模仿iOS的UIPickerView。现在,我想在选择更改时触发触觉反馈,就像UIPickerView一样。

问题在于,当您高速滚动时,scrollViewDidScroll调用的速度不够快。

当前,我正在检查集合视图的x偏移量,并在x偏移量是单元格宽度(12pt)的倍数时触发触觉反馈,但是当x偏移量跳变大于12时,将跳过反馈。

1 个答案:

答案 0 :(得分:0)

当偏移量是单元格宽度的精确倍数时,不要尝试提供反馈,而应在“当前单元格”更改时提供反馈。

保留“当前单元格”(索引)类级变量:

var currentCellIndex: Int = 0

let cellWidth: CGFloat = 12.0  // or however you get it

滚动时,获取“新”单元格:

    let newCellIndex: Int = Int(scrollView.contentOffset.x / cellWidth)

    if newCellIndex != currentCellIndex {
        // provide feedback
        currentCellIndex = newCellIndex
    }

因此,在开始时,contentOffset.x等于0,而currentCellIndex将等于0。当用户滚动时(非常非常缓慢),您将获得:

Int( 1.0 / 12.0) // equals 0, no change
Int( 2.0 / 12.0) // equals 0, no change
Int( 3.0 / 12.0) // equals 0, no change
Int( 4.0 / 12.0) // equals 0, no change
etc ...
Int(12.0 / 12.0) // equals 1, so newIndex != curIndex... provide feedback and update curIndex
Int(13.0 / 12.0) // equals 1, no change
Int(14.0 / 12.0) // equals 1, no change
Int(15.0 / 12.0) // equals 1, no change
Int(16.0 / 12.0) // equals 1, no change
etc ...
Int(24.0 / 12.0) // equals 2, so newIndex != curIndex... provide feedback and update curIndex

当用户快速滚动 时:

Int( 9.0 / 12.0) // equals 0, no change
Int(16.0 / 12.0) // equals 1, so newIndex != curIndex... provide feedback and update curIndex
Int(31.0 / 12.0) // equals 2, so newIndex != curIndex... provide feedback and update curIndex
Int(64.0 / 12.0) // equals 5, so newIndex != curIndex... provide feedback and update curIndex
etc ...