设置滑块值以在 AVPlayer 中设置 SeekToTime
Setting Slider Value to Set SeekToTime in AVPlayer
我正在使用 Player 库,即使用 AVPlayer 和 AVFoundation,这对我的情况来说非常方便。我成功地播放了视频并添加了一个滑块。我将滑块的最小值设置为 0,将最大值设置为视频的持续时间..
此时,为了将滑块连接到当前播放时间,我在 Whosebug 上使用了 。我设置了一个协议并使用了 addPeriodicTimeObserverForInterval
,因此滑块被 linked 到 currentTime 并随着视频成功移动而移动。
现在,这是我的问题。我想做相反的事情并制作 - 当滑块移动时,设置视频的当前时间(向前,向后)。
我做了一些研究,发现 seekToTime
我应该 link slider.value
(sender.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)
}
我正在使用 Player 库,即使用 AVPlayer 和 AVFoundation,这对我的情况来说非常方便。我成功地播放了视频并添加了一个滑块。我将滑块的最小值设置为 0,将最大值设置为视频的持续时间..
此时,为了将滑块连接到当前播放时间,我在 Whosebug 上使用了 addPeriodicTimeObserverForInterval
,因此滑块被 linked 到 currentTime 并随着视频成功移动而移动。
现在,这是我的问题。我想做相反的事情并制作 - 当滑块移动时,设置视频的当前时间(向前,向后)。
我做了一些研究,发现 seekToTime
我应该 link slider.value
(sender.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) }