Существует ли более быстрый способ обнаружения contentOffset в UIScrollView / как UIPickerView вызывает обратную связь даже при высоких скоростях? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть горизонтально прокручиваемый UICollectionView, чтобы имитировать UIPickerView iOS.Теперь я хочу вызвать тактильную обратную связь, когда выбор изменяется так же, как и UIPickerView.

Проблема заключается в том, что при прокрутке на высоких скоростях scrollViewDidScroll вызывается недостаточно быстро.

В настоящее время я проверяю смещение по оси x в представлении сбора и активирую тактильную обратную связь, когдаСмещение по x кратно ширине ячеек (12pt), но когда смещение по x увеличивается более чем на 12, обратная связь пропускается.

1 Ответ

0 голосов
/ 19 апреля 2019

Вместо попытки предоставить обратную связь, когда смещение точно кратно ширине ячейки, предоставьте обратную связь, когда «текущая ячейка» изменится.

Сохранить переменную уровня класса "текущая ячейка" (индекс):

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 ...
...