Как добавить звуковую обратную связь, как pickerview в collectionview? - PullRequest
0 голосов
/ 21 мая 2019

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

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Предполагая, что вы прокручиваете только в одном направлении (например, по вертикали) и что все строки элементов имеют одинаковую высоту, вы можете использовать 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 в любом из них.

0 голосов
/ 21 мая 2019

Вы можете добавить его в методы контроллера представления

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, чтобы дать системе возможность реагировать на методы. Надеюсь, это поможет.

...