【问题标题】:How to AVAudioPlayer with progress bar show using swift?如何使用 swift 显示带有进度条的 AVAudioPlayer?
【发布时间】:2019-01-24 13:26:17
【问题描述】:

我正在使用AVAudioPlayer 播放歌曲。我需要一个进度条来显示歌曲的进度。

我的问题是进度条的进度无法正常工作。在 2-3 秒内,它完成了进度。

func playMusic() {

    do {
        player = try AVAudioPlayer(contentsOf: (currentSong?.mediaURL)!)
        guard let player = player else { return }

        player.prepareToPlay()
        player.play()


        updater = CADisplayLink(target: self, selector: #selector(self.musicProgress))
        updater.frameInterval = 1
        updater.add(to: RunLoop.current, forMode: RunLoop.Mode.common)

        playButton.setImage(UIImage.init(named: "pause"), for: .normal)
    } catch let error as NSError {
        print(error.description)
    }
}

@objc func musicProgress()  {

    let normalizedTime = Float(self.player?.currentTime as! Double * 100.0 / (self.player?.duration as! Double) )
    self.progressMusic.progress = normalizedTime
}

【问题讨论】:

    标签: ios swift avaudioplayer uiprogressbar


    【解决方案1】:

    问题在这里:

    let normalizedTime = Float(self.player?.currentTime as! Double * 100.0 / (self.player?.duration as! Double) )
    

    这样您将获得介于0.0100.0 之间的值,但根据UIProgressView 文档,progress 必须介于0.01.0 之间。试试

    let normalizedTime = Float(self.player?.currentTime as! Double / (self.player?.duration as! Double) )
    

    【讨论】:

    • 我认为您没有正确使用CADisplayLink。该类应该用于在绘制 UI 时更新逻辑,而不是在逻辑更改时更新 UI。尝试使用常规计时器,间隔为 0.05 秒。
    • CADisplayLink 不允许浮点值。
    • 我的意思是你应该试试普通的NSTimer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多