UISlider作为音频搜寻栏,更改后跳到最大值

问题描述 投票:0回答:1

我正在使用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)
          }

ios swift avplayer
1个回答
0
投票

[isTracking,您只需检查滑块的属性,然后不设置进度。像下面的代码

 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)
        if !self. progressBar.isTracking {
           self.progressBar.setValue(sliderPosition, animated: true)
        }
        print("the current time is", currentTime)
        print("the slider position is", sliderPosition)

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.