You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:39:03