Как добавить звуковую обратную связь, например, pickerview в collectionview?

Привет, я пытаюсь добавить отзыв при прокрутке элементов коллекции. Куда мне добавить код для обратной связи в делегатах collectionview. Если я добавлю willDisplay, тогда добавление ячейки, которая будет отображаться изначально, вызовет обратную связь, что не очень хорошо. Мне нужно предоставить обратную связь только тогда, когда пользователь прокручивает и выбирает элемент.


person Arun K    schedule 21.05.2019    source источник
comment
Все ли строки / столбцы имеют одинаковую высоту / ширину, или ваши элементы имеют произвольный размер?   -  person Cœur    schedule 21.05.2019
comment
Что именно вы пробовали до сих пор? Как выглядит ваш существующий код?   -  person ZGski    schedule 21.05.2019


Ответы (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 в любом из них.

person Cœur    schedule 21.05.2019
comment
Спасибо. Я проверю, соответствует ли это моим требованиям. - person Arun K; 21.05.2019
comment
@ArunK также, если вы хотите привязать к фиксированным позициям при прокрутке, как UIPickerView, вам необходимо реализовать прокрутку, подобную разбивке на страницы. Это объясняется в других вопросах / ответах на Stack Overflow. - person Cœur; 21.05.2019
comment
Я бы предложил использовать >= 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, чтобы дать системе возможность отреагировать на методы. Надеюсь это поможет.

person nishith Singh    schedule 21.05.2019