Вместо попытки предоставить обратную связь, когда смещение точно кратно ширине ячейки, предоставьте обратную связь, когда «текущая ячейка» изменится.
Сохранить переменную уровня класса "текущая ячейка" (индекс):
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 ...