设置滑块值以在 AVPlayer 中设置 SeekToTime

Setting Slider Value to Set SeekToTime in AVPlayer

我正在使用 Player 库,即使用 AVPlayer 和 AVFoundation,这对我的情况来说非常方便。我成功地播放了视频并添加了一个滑块。我将滑块的最小值设置为 0,将最大值设置为视频的持续时间..

此时,为了将滑块连接到当前播放时间,我在 Whosebug 上使用了 。我设置了一个协议并使用了 addPeriodicTimeObserverForInterval,因此滑块被 linked 到 currentTime 并随着视频成功移动而移动。

现在,这是我的问题。我想做相反的事情并制作 - 当滑块移动时,设置视频的当前时间(向前,向后)。

我做了一些研究,发现 seekToTime 我应该 link slider.valuesender.value 在我的情况下)但是,我不能了解如何将其应用于播放器。如何让滑块控制当前时间?


我不确定我是否正确,但据我了解,第一步应该是:

protocol UserSetsTheTimeDelegate
{
  func userSetsTheTime(result: Int)
}

class ViewController: UIViewController, PlayerDelegate {
       ...

  func sliderValueDidChange(sender:UISlider!) {
     print("value--\(sender.value)")
     self.delegate?.userSetsTheTime(sender.value)
  }
}

然后添加,我想我应该在 Player.swift 中添加 UserSetsTheTimeDelegate,但我在这里感到困惑。


更新:

我意识到我可以通过在 ViewController 中使用一个实例并在 Player class 中添加一个方法来将数据发送到 Player.swift。这是第一步。但是现在,由于 currentTime 更新(通过修改滑块)如此之快,它不允许我操纵滑块值。

我解决了我的问题。我创建了一个 Player 实例,因此我能够将数据从视图控制器发送回 Player class。然后我简单地应用了seekToTime()。在这一点上,从视觉上看,它看起来很差,但后来我注意到我可以使用 stop()setCurrentTime() 然后 play() 以使它看起来更好。

从用户体验的角度来看,最好在滑块上的 touchUp 之后调用 Player 上的 seek() 方法,而不是在值更改时调用。

如您所见,您对 sliderValueDidChange 的体验很差。

相反,尝试在滑块上的 UIControlEvents.TouchUpInside(例如)上添加 target/action,然后只搜索。体验应该会更好。


    var slider : UISlider! {
        didSet {
          slider.addTarget(self, action: Selector("touchUp:"), forControlEvents: [UIControlEvents.TouchUpInside])
        }
    }

    func touchUp(sender:AnyObject?) {
        // player.seek(slider.currentValue)
    }