Ios UISlider as audio seekbar在更改时跳至最大值

Ios UISlider as audio seekbar在更改时跳至最大值,ios,swift,avplayer,Ios,Swift,Avplayer,我正在使用UISlider作为音频搜索栏,如果没有设置动画,它可以很好地调整以改变曲目中的位置。如果它设置了动画,效果会很好,并且可以沿条沿轨迹完美地跟踪,但是如果在动画处于活动状态时尝试调整它,它会跳到条的最大值。我假设这两个过程之间存在冲突,但我正在努力解决 func changeProgressBar() { let trackLength = Float(AudioService.shared.playerItem?.duration.seconds ?? 0) Tim

我正在使用
UISlider
作为音频搜索栏,如果没有设置动画,它可以很好地调整以改变曲目中的位置。如果它设置了动画,效果会很好,并且可以沿条沿轨迹完美地跟踪,但是如果在动画处于活动状态时尝试调整它,它会跳到条的最大值。我假设这两个过程之间存在冲突,但我正在努力解决

func changeProgressBar() {
    let trackLength = Float(AudioService.shared.playerItem?.duration.seconds ?? 0)

    Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true){_ in
        let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
           let sliderPosition = currentTime / (trackLength / 100)

           self.progressBar.setValue(sliderPosition, animated: true)
           print("the current time is", currentTime)
           print("the slider position is", sliderPosition)
    }
}

@IBAction func progressBarValueChanged(_ sender: UISlider) {
    let trackLength = AudioService.shared.playerItem?.duration.seconds ?? 0
    let sliderValueFloat = progressBar.value * 100.00
    let sliderValueDouble = Double(sliderValueFloat)
    let targetTime = (trackLength / 100 * sliderValueDouble)
    let targetTimeActual = CMTimeMake(value: Int64(targetTime), timescale: 1)
    AudioService.shared.player!.seek(to: targetTimeActual)
}
我有加或减30秒的按钮,在轨迹中向前或向后跳跃,即使动画处于活动状态,它们也能正常工作

@IBAction func plus30Secs(_ sender: UIButton) {
    let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
    let seekTime = currentTime + 30
    let seekTimeActual = CMTimeMake(value: Int64(seekTime), timescale: 1)
    AudioService.shared.player!.seek(to: seekTimeActual)
}

@IBAction func minus30Secs(_ sender: UIButton) {
    let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
    let seekTime = currentTime - 30
    let seekTimeActual = CMTimeMake(value: Int64(seekTime), timescale: 1)
    AudioService.shared.player!.seek(to: seekTimeActual)
}
好的,我已经修好了

问题是我的
progressBar.maximumValue=100
意味着我的
progressBar.value*100.00
给出的值是它应该给出的值的100倍,因此该值超出了轨道的末端。我删除了
*100.00
,现在它工作得很好。

好的,我已经修复了它


问题是我的
progressBar.maximumValue=100
意味着我的
progressBar.value*100.00
给出的值是它应该给出的值的100倍,因此该值超出了轨道的末端。我删除了
*100.00
,现在它工作得很好。

您可能需要更改
DispatchQueue.main.async
中的滑块值您可能需要更改
DispatchQueue.main.async