0

我有一个scrollViewwith pagingEnabledset to true。这些页面中的每一页都包含一个覆盖整个屏幕的视频。使用for循环和一个名为的类PlayerView添加视频(不仅添加视频,还添加有关视频的信息)。在PlayerView课堂上,我有一个功能可以开始/停止在相应页面中播放视频,并且一切正常。

self.player?.seek(to: kCMTimeZero)我的问题是,只要包含该视频的页面不再可见(使用and ) ,我想将视频设置为它的开头并在那里停止(可以说是 0.0 秒self.player?.pause())。

在我的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))
}

你知道如何暂停前一页的视频吗?我将衷心感谢您的帮助!

4

1 回答 1

1

我认为您可以通过两种方式来执行此操作,具体取决于您希望视频停止的方式。

方法一:上一个视图的视频停止,新视图的视频不自动播放

您可以在每个视图中创建一个通知观察者,它监听滚动视图的变化并触发一个通用函数来停止视频(创建一个协议来将这些视图约束到通用函数是一种很好的做法,尽管我不会这样做在这里)。因此,在每个视图中,您都可以在 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()
    }
于 2017-06-02T16:18:17.027 回答