我有一个scrollView
与pagingEnabled
设置为true
。这些页面中的每一个都包含一个覆盖整个屏幕的视频。使用for
循环和一个名为的类PlayerView
添加视频(不仅添加视频,还添加有关视频的信息)。在PlayerView
课程中,我有一个功能可以开始/停止在相应页面中播放视频,并且一切正常。
我的问题是,每当包含该视频的页面不再可见(使用self.player?.seek(to: kCMTimeZero)
和self.player?.pause()
)时,我想将视频设置为它的开头并在那里停止(可以说是 0.0 秒)。
在我的scrollView
我有一个函数,它检测出现了哪个页面,并在用户从一个页面滚动到另一个页面时指出上一页(以索引的形式,例如当从第 2 页滚动到第 3 页时,该函数将打印:“1 2”)。举个例子:我想将第 2 页(索引:1)上的视频设置为 0 并暂停它。
class HomeController: UIViewController, UIScrollViewDelegate
)func initiateScrollView() {
//create scrollView with paging enabled
let scrollView = UIScrollView(frame: view.bounds)
scrollView.isPagingEnabled = true
scrollView.delegate = self
view.addSubview(scrollView)
//get page size
let pageSize = view.bounds.size
//three simple UIView are created (view1, view2, view3)
//array with individual views
let pagesViews = [view1, view2, view3]
//amount of views
let numberOfPages = pagesViews.count
//add subviews (pages)
for (pageIndex, page) in pagesViews.enumerated(){
//add individual pages to scrollView
page.frame = CGRect(origin: CGPoint(x:0 , y: CGFloat(pageIndex) * pageSize.height), size: pageSize)
scrollView.addSubview(page)
//add Subview with videoplayer frame to individual "pages"
let videoPlayerFrame = CGRect(x: 0, y: 0, width: pageSize.width, height: pageSize.height)
let videoPlayerView = PlayerView(frame: videoPlayerFrame)
page.addSubview(videoPlayerView)
}
//adjust size of scrollView
scrollView.contentSize = CGSize(width: pageSize.width, height: pageSize.height * CGFloat(numberOfPages))
}
您知道如何暂停上一页的视频吗?我将衷心感谢您的帮助!
我认为您可以通过两种方式执行此操作,具体取决于您希望视频停止的准确程度。
方法一:上一个视图的视频停止,新视图的视频不自动播放
您可以在每个视图中创建一个通知观察者,它监听滚动视图的变化并触发一个通用函数来停止视频(创建一个协议来将这些视图限制为通用函数是一种很好的做法,尽管我不会这样做在这里)。所以在每个视图中,你在 ViewDidLoad 中添加一个像这样的观察者:
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.stopVideo), name: NSNotification.Name(rawValue: "stopVideo"), object: nil)
然后添加将在视图中调用的相应函数:
func stopVideo() {
self.player.stop()
}
然后在您的滚动视图中,在您提到的“检测出现的页面并说明上一页”的功能中,只要滚动视图发生变化,您就会发出通知:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "stopVideo"), object: nil)
每当视图发生变化时,这将停止在所有视图中播放任何视频。PS 还要记得去掉 deinit() 中的观察者
方法二:上一视图的视频停止,新视图的视频会自动播放
如果上一个视频将停止并且新视频将自动播放,您可以为他们必须遵守的每个视图制定一个协议,如下所示:
protocol StopVideoDelegate: class {
func stopVideo()
func startVideo()
}
您的每个视图都必须实现此协议,例如:
class ViewController1InScrollView: StopVideoDelegate {
func stopVideo() {
self.playerLayer.stop()
}
func startVideo() {
self.playerLayer.start()
}
}
然后在您的滚动视图中,在您提到的“检测出现了什么页面并说明上一页”的功能中,可以简单地将上一个视图和下一个视图转换为协议类型并调用相应的函数:
func theFunctionThatDetectsViewChangeInScrollView() {
nextView as! StopVideoDelegate
nextView.startVideo()
previousView as! StopVideoDelegate
previousView.stopVideo()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句