设置滑块值以在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()
以使其看起来更好。