Swift: Воспроизведение звука в tapGestureRecognizer, который соответствует просмотру - PullRequest
0 голосов
/ 12 мая 2019

В методе forEach я получил массив видов (один вид - карточка с изображением животного). И это вид колоды карт, и при проведении влево или вправо следующая карта появляется. Поэтому я хотел бы воспроизвести звук в UITapgestureRecognize, который соответствует просмотру.

Животноводство:

class AnimalsStock {

    var list = [Animal]()
    init() {

        let item =  Animal(name: "Bear", soundUrl: "Bear", imageName: "Bear")

        list.append(item)

        list.append(Animal(name: "Cat", soundUrl: "Cat", imageName: "Cat"))
        list.append(Animal(name: "Chicken", soundUrl: "Chicken", imageName: "Chicken"))
        list.append(Animal(name: "Cow", soundUrl: "Cow", imageName: "Cow"))
}
}

Контроллер основного вида

HomeController: UIViewController {
   func setupCards() {

        allAnimals.list.forEach { (animal) in   
            let cardView = CardView(frame: .zero)
            cardView.imageView.image = UIImage(named: animal.imageName)
            cardView.animalLabel.text = animal.name
            cardDeckView.addSubview(cardView)
            cardView.fillSuperview()
        }

    }
}

и файл с UITapgestureRecognizer

 class CardView: UIView {

@objc fileprivate func tapCard(recognizer: UITapGestureRecognizer) {
        // Here, I would like to implement a method that plays a sound that matches to the image
        pulseCard()

    }
}

Метод воспроизведения звука:

var player : AVAudioPlayer?

func playSound(soundUrl: String) {
    guard let url = Bundle.main.url(forResource: soundUrl, withExtension: "mp3") else { return }
    do
    {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
        try AVAudioSession.sharedInstance().setActive(true)

        player = try AVAudioPlayer(contentsOf: url)
        guard let player = player else { return }

        player.play()
    } catch let error {
        print(error.localizedDescription)
    }
}
func stopSound() {
    if player != nil {
        player?.stop()
    }

}

Заранее спасибо

Ответы [ 2 ]

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

Решение моей проблемы - проверить свойство view в распознавателе, а затем мы получаем выбранную карту:

@objc fileprivate func tapCard(recognizer: UITapGestureRecognizer, for card: CardView) {
        if let cardView = recognizer.view as? CardView {
        playSound(soundUrl: cardView.animalLabel.text!)
        }
        pulseCard()
    }
0 голосов
/ 12 мая 2019

Вы можете назначить каждому CardView уникальный тег в цикле for-each, перечислив элементы и затем получить доступ к списку животных с этим тегом / индексом, чтобы получить URL.

В качестве альтернативы вы всегда можете присвоить CardView свойство Animal и просто присвоить его, так что CardView просто нужно зачитать животное, которому оно было назначено.

...