Привет, я пытаюсь добавить отзыв при прокрутке элементов коллекции. Куда мне добавить код для обратной связи в делегатах collectionview. Если я добавлю willDisplay, тогда добавление ячейки, которая будет отображаться изначально, вызовет обратную связь, что не очень хорошо. Мне нужно предоставить обратную связь только тогда, когда пользователь прокручивает и выбирает элемент.
Как добавить звуковую обратную связь, например, pickerview в collectionview?
Ответы (2)
Предполагая, что вы прокручиваете только в одном направлении (например, по вертикали) и что все строки элементов имеют одинаковую высоту, вы можете использовать scrollViewDidScroll(_:)
для обнаружения выбора, такого как UIPickerView.
class ViewController {
var lastOffsetWithSound: CGFloat = 0
}
extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if let flowLayout = ((scrollView as? UICollectionView)?.collectionViewLayout as? UICollectionViewFlowLayout) {
let lineHeight = flowLayout.itemSize.height + flowLayout.minimumLineSpacing
let offset = scrollView.contentOffset.y
let roundedOffset = offset - offset.truncatingRemainder(dividingBy: lineHeight)
if abs(lastOffsetWithSound - roundedOffset) > lineHeight {
lastOffsetWithSound = roundedOffset
print("play sound feedback here")
}
}
}
}
Помните, что UICollectionViewDelegateFlowLayout
наследует UICollectionViewDelegate
, который сам наследует UIScrollViewDelegate
, поэтому вы можете объявить scrollViewDidScroll
в любом из них.
>= lineHeight
. В противном случае пропускает некоторые ячейки
- person Mike; 18.07.2020
Вы можете добавить его в методы контроллера представления
touchesBegan(_:with:)
touchesMoved(_:with:)
Таким образом, всякий раз, когда пользователь взаимодействует с вашим контроллером представления в любом месте, вы можете предоставить обратную связь, и она будет ограничена только взаимодействием с пользователем, а не при программном добавлении ячейки или вызове обновления в представлении таблицы.
Если у вас есть и другие компоненты пользовательского интерфейса в вашем контроллере, и вы хотите ограничить обратную связь для вашего представления коллекции, а не для других компонентов, вы можете проверить представление в этих методах.
let touch: UITouch = touches.first as! UITouch
if (touch.view == collectionView){
println("This is your CollectionView")
}else{
println("This is not your CollectionView")
}
Не забудьте вызвать super, чтобы дать системе возможность отреагировать на методы. Надеюсь это поможет.