Swift 4 带AVPlayer的UISlider不滑动

Swift 4 The UISlider with AVPlayer doesn't slide

我正在尝试使用 UISlider 控制音频,print() 语句打印出正确的值并且应用程序没有崩溃,但是当我尝试抓住它并移动滑块时(拇指色调),UISlider 不会滑动,但当我尝试滑动它时会移动一点(就像点击一样)。 当我评论第 6 行时,滑块响应正确(但当然没有任何反应)。

var playerItem : AVPlayerItem?
var player : AVPlayer?    
@IBAction func adjustSongProgress(_ sender: UISlider) {
    player?.pause()
    let floatTime = Float(CMTimeGetSeconds(player!.currentTime()))
    sliderProgressOutlet.value = floatTime
    print(floatTime)
    player?.play()
}

iOS 滑块取值在 0 到 1 之间。如果 CMTimeGetSeconds return 值在 0 到 1 之外,它将无法正确设置。

因此您必须将时间范围转换为滑块范围。

例如:你的 video/audio 长度是 120 秒,你想将滑块移动到 30 second.than 你可以使用下面的函数计算新值。

OldRange = (OldMax - OldMin)
NewRange = NewMax - NewMin

NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin

oldRange = 120 - 0
newRange = 1 - 0
New value = (30-0)*1/120+0 = 0.25

通过删除 AVPlayer 并将 AVPlayerItem 更改为 AVAudioPlayer,然后将歌曲 URL 放入数据来修复它:`

    //DOWNLOADS THE SONG IN THE URL AND PUTS IT IN DATA
    var task: URLSessionTask? = nil

    if let songUrl = songUrl {
        task = URLSession.shared.dataTask(with: songUrl, completionHandler: { data, response, error in
            // SELF.PLAYER IS STRONG PROPERTY
            if let data = data {
                self.playerItem = try? AVAudioPlayer(data: data)
                self.playPause()
                DispatchQueue.main.async {
                    self.sliderProgress()
                }
            }
        })
        task?.resume()`

然后我将UISliderIBActionValue Changed更改为Touch DownTouch Up Inside当我将它连接到ViewController时:

    // TOUCH DOWN
@IBAction func SliderTouchDown(_ sender: UISlider) {
    playerItem?.pause()
}

//TOUCH UP INSIDE
@IBAction func SliderTouchUpInside(_ sender: UISlider) {
    playerItem?.currentTime = TimeInterval(sliderProgressOutlet.value)
    playerItem?.play()
}