Кнопка AVPlayer UIButton — показать кнопку воспроизведения или приостановки изображения в зависимости от того, включен или выключен поток

#ios #swift #uibutton #avplayer #avkit

Вопрос:

У меня есть приложение, которое воспроизводит аудио в формате mp3 с двумя кнопками изображения — воспроизведение и остановка. Теперь я хотел бы немного улучшить его. Прямо сейчас у меня есть два изображения в формате .png (воспроизведение.png и пауза.png), и я хотел бы, чтобы они менялись друг с другом нажатием в зависимости от того, включен поток или выключен. Есть идеи, как это сделать? Вот мой код:

 import UIKit
import AVKit
import MediaPlayer

class ViewController: UIViewController, AVAudioPlayerDelegate {
    
    var player : AVPlayer!
    var dict = NSDictionary()
    
    
    
    
    @IBAction func playButtonPressed(_ sender: UIButton){
        let url = "https://stream.com/radio.mp3"
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay])
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, options: [])
            print("Playback OK")
            try AVAudioSession.sharedInstance().setActive(true)
            print("Session is Active")
        } catch {
            print(error)
        }
        
            player = AVPlayer(url: URL(string: url)!)
            player.volume = 1.0
            player.rate = 1.0
            player.play()
        
    
    }
    
    
    
    @IBAction func stopButtonStopped(sender: UIButton) {
        player.pause()
    }
 

Ответ №1:

Моя ошибка заключалась в том, что я пытался добавить pause.png и play.png sender.setImage(playImage, for: .normal вместо объявления его в let keword:

 let play = UIImage(named: "play.png")
 

Код, который на самом деле работает, это:

 @IBAction func buttonPressed(_ sender: UIButton){
          
          if isPlaying {
               player.pause()
               sender.setImage(pauseImage, for: .normal)
          } else {
               let url = "https://stream.com/radio.mp3"
               do {
                    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay])
                    try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, options: [])
                    print("Playback OK")
                    try AVAudioSession.sharedInstance().setActive(true)
                    print("Session is Active")
               } catch {
                    print(error)
               }
               
               player = AVPlayer(url: URL(string: url)!)
               player.volume = 1.0
               player.rate = 1.0
               player.play()
               sender.setImage(playImage, for: .normal)
          }
          
          isPlaying.toggle()
     }