Как воспроизводить звук с помощью одной кнопки на основе изображения UIimageview - PullRequest
0 голосов
/ 06 июля 2019

Я разработал полностью работающее приложение для детей. Он имеет UIImageView, который циклически перебирает 26 карт (abcs) с помощью жестов, и музыкальную кнопку, которая будет воспроизводить звук для каждого изображения. Прямо сейчас у меня это 100% работает, НО звук воспроизводится в операторе IF, который добавил 400 дополнительных строк кода.

Пример музыкальной кнопки:

        if (imageView.image?.isEqual(UIImage(named: "card1")))! {
            do { audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: aSound))
                audioPlayer.play()
            } catch {
                print("Couldn't load sound file")
            }
        }
        else if (imageView.image?.isEqual(UIImage(named: "card2")))! {
            do { audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: bSound))
                audioPlayer.play()
            } catch {
                print("Couldn't load sound file")
            }
        }
        else if (imageView.image?.isEqual(UIImage(named: "card3")))! {
            do { audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: cSound))
                audioPlayer.play()
            } catch {
                print("Couldn't load sound file")
            }
        }

Я знаю, что мог бы установить звуковой массив со звуковыми файлами в нем, но как мне привязать его к карте? Я не могу установить свойство тега на изображение актива, могу я?

Ищите способ сократить текущий код, который у меня есть.

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Такой подход совершенно неверен. Ваш просмотр изображения просмотр . Вы не должны делать какие-либо выборы в зависимости от того, что он отображает. Вы должны сделать свой выбор, основываясь на чем-то о вашей модели данных .

Например, допустим, у вас есть три изображения и массив из трех имен изображений:

let images = ["Manny", "Moe", "Jack"]
var currentImageIndex = 0

И скажем, вы изменили индекс изображения и отобразили это изображение:

self.currentImageIndex = 1
self.imageView.image = UIImage(named:images[currentImageIndex])

Тогда вы узнаете, какое изображение отображается, взглянув на currentImageIndex - , а не , взглянув на изображение.

В реальной жизни ваша модель может быть гораздо более обширной, например структура и массив структур. Но принцип остается точно таким же. Это модель , которая говорит вам, что делать, а не интерфейс .

0 голосов
/ 06 июля 2019

вот путь, по которому я бы пошел. Я не проверял это, но это должно привести вас туда! Я использую массивы, но Set или Dictionary будут работать.

1) Создать структуру

struct Card {
    let soundURL: URL
    let image: UIImage
}

2) собрать все карты в массиве:

let cards: [Card] = {
    var collection = [Card]()
    let soundPaths: [String] = ["aSound", "bSound", "xSound", "zSound"]
    let cardNames: [String] = ["card1", "card2", "card25", "card26"]

    // array of all 26 urls
    var soundUrls: [URL] {
        var urls = [URL]()
        for path in soundPaths {
            urls.append(URL(fileURLWithPath: path))
        }
        return urls
    }

    // array of all 26 images
    var cardImages: [UIImage] {
        var images = [UIImage]()
        for name in cardNames {
            guard let image = UIImage(contentsOfFile: name) else { continue }
            images.append(image)
        }
        return images
    }

    // not the best approach but if you have sound and naming
    // in the order then:
    for idx in 0..<26 {
        let card = Card(soundURL: soundUrls[idx], image: cardImages[idx])
        collection.append(card)
    }

    return collection
}()

3) добавить расширение для UIImage для воспроизведения звука:

extension UIImage {
    func playSound() {
        let card = cards.filter { $0.image == self }.first
        if card != nil {
            do {
                let audioPlayer = try AVAudioPlayer(contentsOf: card!.soundURL)
                audioPlayer.play()
            } catch {
                print("Couldn't load the sound file with error: \(error)")
            }
        }
    }
}

Затем, когда вы получите свой imageView.image, вы сможете просто сделать:

imageView.image?.playSound()

Снова я не проверял это, но я думаю, что логика все еще остается в силе. Надеюсь, это поможет.

...