滚动到新页面时,将旧页面上的视频设置为 0.0 秒

Set video on old page to 0.0 seconds when scrolled to new page

我有一个 scrollViewpagingEnabled 设置为 true。这些页面中的每一页都包含一个覆盖整个屏幕的视频。使用 for 循环和称为 PlayerView 的 class 添加视频(不仅添加视频,还添加有关视频的信息)。在 PlayerView class 中,我有一个 starts/stops 在相应页面中播放视频的功能,一切正常。

我的问题是,只要包含该视频的页面不再可见(self.player?.seek(to: kCMTimeZero)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))
}

您知道如何暂停上一页的视频吗?非常感谢您的帮助!

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

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

您可以在每个视图中创建一个通知观察器,它监听滚动视图的变化并触发一个通用函数来停止视频(最好创建一个协议来将这些视图约束到通用函数虽然我不会在这里这样做)。因此,在每个视图中,您都在 ViewDidLoad 中添加这样的观察者:

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.stopVideo), name: NSNotification.Name(rawValue: "stopVideo"), object: nil)

然后添加将在视图中调用的相应函数:

    func stopVideo() {

        self.player.stop()

    }

然后在您的滚动视图中,在您提到的 "detects what page has appeared and also states the previous page" 函数中,只要滚动视图发生变化,您就会触发通知:

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "stopVideo"), object: nil)

这将在视图发生变化时停止在所有视图中播放任何视频。 P.S 还有记得在deinit()中去掉观察者

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

如果之前的视频将停止而新视频将自动播放,您可以为他们必须遵守的每个视图制定协议,如下所示:

    protocol StopVideoDelegate: class {
        func stopVideo()
        func startVideo()
    }

您的每个视图都必须实现此协议,例如:

    class ViewController1InScrollView: StopVideoDelegate {
         func stopVideo() {
             self.playerLayer.stop()
         }
         func startVideo() {
             self.playerLayer.start()
         }
    }

然后在你的scrollview中,在你提到的函数中"detects what page has appeared and also states the previous page",可以简单地将上一个视图和下一个视图转换为协议类型并调用相应的函数:

    func theFunctionThatDetectsViewChangeInScrollView() {
        nextView as! StopVideoDelegate
        nextView.startVideo()

        previousView as! StopVideoDelegate
        previousView.stopVideo()
    }