簡體   English   中英

滾動到新頁面時,將舊頁面上的視頻設置為0.0秒

[英]Set video on old page to 0.0 seconds when scrolled to new page

我有一個scrollView pagingEnabled設置為true pagingEnabled 這些頁面中的每個頁面都包含一個覆蓋整個屏幕的視頻。 使用for循環和名為PlayerView的類添加視頻(不僅添加視頻,而且包含有關視頻的信息)。 PlayerView類中,我有一個功能,可以開始/停止在相應頁面中播放視頻,並且一切正常。

我的問題是,無論何時不再包含該視頻的頁面(使用self.player?.seek(to: kCMTimeZero)我都希望將視頻設置為開始並在此處停止播放(可以說是0.0秒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))
}

您是否有辦法暫停上一頁中的視頻? 我將衷心感謝您的幫助!

我認為您可以通過兩種方式來完成此操作,具體取決於您希望視頻停止播放的程度。

方法1:上一個視圖上的視頻停止並且新視圖上的視頻不能自動播放

您可以在每個視圖中創建一個Notification觀察器,以偵聽滾動視圖的變化並觸發通用功能來停止視頻(創建協議以將這些視圖限制為通用功能是一種很好的做法,盡管我不會這樣做在這里)。 因此,在每個視圖中,您都需要在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()中刪除觀察者

方法2:上一個視圖上的視頻停止並且新視圖上的視頻會自動播放

如果上一個視頻將停止並且新視頻將自動播放,則可以為它們必須遵守的每個視圖制定協議,如下所示:

    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()
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM