AVPlayer UIButton如何根据流播放状态切换play/pause图片显示
音频播放按钮图片切换实现方案
你现有代码存在每次点击播放都会重复创建AVPlayer实例的问题,会导致性能浪费和状态跟踪异常,我们先调整逻辑再实现图片切换功能,有两种实现方式可选:
方案1:合并为单个切换按钮(推荐)
仅用一个按钮根据播放状态切换显示图片,逻辑更简洁。
步骤1:新增属性
在ViewController类中新增如下属性:
// 从Storyboard/XIB中绑定你的控制按钮 @IBOutlet weak var controlButton: UIButton! // 播放状态标记 var isPlaying: Bool = false // 懒加载AVPlayer,仅初始化一次避免重复创建 lazy var player: AVPlayer? = { guard let url = URL(string: "https://stream.com/radio.mp3") else { return nil } return AVPlayer(url: url) }()
步骤2:配置初始状态
在viewDidLoad方法中设置按钮初始显示图片:
override func viewDidLoad() { super.viewDidLoad() // 初始未播放,显示播放按钮图片 controlButton.setImage(UIImage(named: "play.png"), for: .normal) }
步骤3:修改点击事件逻辑
删除原有两个IBAction,替换为单个点击事件:
@IBAction func controlButtonTapped(_ sender: UIButton) { // 首次播放时初始化音频会话 if player != nil && !isPlaying { do { try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay]) try AVAudioSession.sharedInstance().setActive(true) } catch { print(error) return } } if isPlaying { // 正在播放时点击,执行暂停 player?.pause() sender.setImage(UIImage(named: "play.png"), for: .normal) } else { // 暂停时点击,执行播放 player?.play() sender.setImage(UIImage(named: "pause.png"), for: .normal) } // 切换状态标记 isPlaying.toggle() }
注意:请确认play.png和pause.png已经正确加入Xcode项目的Assets目录中,文件名拼写完全一致,否则会出现图片加载失败的问题
方案2:保留原有两个按钮
如果不想合并两个按钮,只需要修改按钮显隐逻辑即可:
步骤1:新增属性绑定按钮
// 绑定原有播放、暂停按钮 @IBOutlet weak var playButton: UIButton! @IBOutlet weak var pauseButton: UIButton!
步骤2:配置初始显隐
override func viewDidLoad() { super.viewDidLoad() playButton.isHidden = false pauseButton.isHidden = true }
步骤3:修改原有点击事件
@IBAction func playButtonPressed(_ sender: UIButton){ let url = "https://stream.com/radio.mp3" do { try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay]) print("Playback OK") try AVAudioSession.sharedInstance().setActive(true) print("Session is Active") } catch { print(error) } // 避免重复创建AVPlayer if player == nil { player = AVPlayer(url: URL(string: url)!) player.volume = 1.0 } player.play() // 切换按钮显隐 playButton.isHidden = true pauseButton.isHidden = false } @IBAction func stopButtonStopped(sender: UIButton) { player.pause() // 切换按钮显隐 playButton.isHidden = false pauseButton.isHidden = true }
内容的提问来源于stack exchange,提问作者LewTrocki
相关产品推荐
相关产品推荐

