使用 AVAudioPlayer 进行 UISlider 更新

dar*_*ger 3 avaudioplayer ios swift swift3

我正在制作一个简单的音频播放器应用程序,它允许用户使用 UISlider 更改他们在曲目中的位置。

它不做的事情:滑块不会根据曲目的进度进行更新。我在这里发现了一个类似的问题,第二个答案是响应AVAudioPlayer- 建议使用currentTime更新滑块。我想尝试这样做。

这是我的代码:

import UIKit
import AVFoundation

class MusicViewController: UIViewController {

    ....

    @IBOutlet var Slider: UISlider!

    @IBAction func changeAudioTime(_ sender: Any) {
        Slider.maximumValue = Float(audioPlayer.duration)
        audioPlayer.stop()
        audioPlayer.currentTime = TimeInterval(Slider.value)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    }

    func updateSlider(){

        Slider.value = Float(audioPlayer.currentTime)
        print("Changing works")
    }
Run Code Online (Sandbox Code Playgroud)

第一个函数工作正常——用户可以改变他们所在的位置。但是,我的第二个功能应该Slider.value根据currentTimeAudioPlayer 的 进行更改。它不这样做。

它也没有打印,所以我相信它没有触发。

我是 Swift 的新手,所以我可能会遗漏一些东西。有任何想法吗?

Aka*_*ore 5

测试代码:-

添加定时器变量

var timer: Timer?
Run Code Online (Sandbox Code Playgroud)

在您开始播放音频的功能中:

    slidderrr.value = 0.0
    slidderrr.maximumValue = Float((player?.duration)!)
    audioPlayer.play()
    timer = Timer.scheduledTimer(timeInterval: 0.0001, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)

当您不想更新滑块时,不要忘记使计时器无效

func stopPlayer() {
    player?.stop()
    timer?.invalidate()
    print("Player and timer stopped")
  }
Run Code Online (Sandbox Code Playgroud)