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

我正在使用播放器库,即使用AVPlayer和AVFoundation,这对我来说非常方便。 我成功地设法播放了video并添加了一个滑块。 我将滑块的min设置为0,将max设置为video的持续时间。

此时,为了将滑块连接到当前播放时间,我在StackOverflow上使用了这个答案 。 我设置了一个协议并使用了addPeriodicTimeObserverForInterval ,因此滑块链接到currentTime并在video成功移动时移动。

现在,这是我的问题。 我想反过来做 – 当滑块移动时,设置video的currentTime(向前,向后)。

我做了一些研究,我发现它是seekToTime ,我应该链接slider.value (在我的情况下是slider.value )但是,我无法理解如何将它应用于Player。 如何使滑块控制当前时间?


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

 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类中添加方法将数据发送到Player.swift。 这是第一步。 但现在,由于currentTime正在快速更新(修改滑块),它不允许我操纵滑块值。

从UX的角度来看, touchUp在滑块上的touchUp之后调用Player上的seek()方法,而不是在值发生变化时调用。

正如您所注意到的,您对sliderValueDidChange体验sliderValueDidChange

相反,尝试在滑块上的UIControlEvents.TouchUpInside(例如)上添加目标/操作,然后只搜索。 经验应该更好。


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

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

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