我有一个水平滚动的UICollectionView来模仿iOS的UIPickerView。现在,我想在选择更改时触发触觉反馈,就像UIPickerView一样。
问题在于,当您高速滚动时,scrollViewDidScroll调用的速度不够快。
当前,我正在检查集合视图的x偏移量,并在x偏移量是单元格宽度(12pt)的倍数时触发触觉反馈,但是当x偏移量跳变大于12时,将跳过反馈。
答案 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 ...