#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()
}