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

标签 ios swift uiscrollview scroll-paging

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

我的问题是,当包含该视频的页面不再可见时(使用 self.player?. seek(to: kCMTimeZero)self.player?.pause()

在我的 scrollView 中,我有一个功能,它检测出现了什么页面,并在用户从一个页面滚动到另一个页面时(以索引的形式,例如从页面滚动时)指出上一页2 到第 3 页函数将打印:"1 2")。举个例子:我想将第 2 页(索引:1)上的视频设置为 0 并暂停。

创建 scrollView(在 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))
}

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

最佳答案

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

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

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

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

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

    func stopVideo() {

        self.player.stop()

    }

然后在您的 ScrollView 中,在您提到的“检测出现的页面并说明上一页”的功能中,只要 ScrollView 发生变化,您就会触发通知:

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

每当 View 发生变化时,这将停止在所有 View 中播放任何视频。 P.S 还要记得在 deinit() 中移除观察者

方法二:上一 View 视频停止,新 View 视频自动播放

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

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

您的每个 View 都必须实现此协议(protocol),例如:

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

然后在你的scrollview中,在你提到的“检测出现了什么页面并说明上一页”的函数中,可以简单地将上一个 View 和下一个 View 转换为协议(protocol)类型并调用相应的函数:

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

        previousView as! StopVideoDelegate
        previousView.stopVideo()
    }

关于ios - 滚动到新页面时,将旧页面上的视频设置为 0.0 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44328964/

相关文章:

iphone - 嵌套的 UINavigationControllers

iphone - 如何验证 UITextField 的内容?

ios - iOS swift 拍摄视频时保持手电筒开启

ios - 如何向 UIImagePickerController 添加一些选项

ios - 如何更改特定 UITabBarItem 的背景

ios - 尽管不使用自动布局,但垂直滚动在 UIScrollView 和 iOS7 和 Xcode 5 中不起作用

ios - UIScrollView 的 ContentView 中的 UIViewControllers?

iphone - UITapGestureRecognizer 没有做任何事情

iphone - 应用程序在UIScrollview中加载太多图像时崩溃

ios - 是否可以降低状态栏的高度?