2016-05-16 51 views
2

我正在播放使用AVPlayer的視頻,這是我的應用程序中大約320x200的幀。 avplayer還有一個自定義的「全屏」按鈕,如youtube應用播放器。我如何實現它,以便當應用程序處於肖像模式並且用戶單擊全屏按鈕時,視頻將旋轉至全屏但處於橫向模式?我嘗試使用轉換,它部分工作,因爲當它在全屏模式下,如果用戶切換設備爲縱向; avplayer框架突然改變。我希望它能像YouTube應用一樣工作,即在全屏模式下,即使用戶旋轉設備,也應該保持這種狀態。關閉全屏後,只能恢復原始尺寸。由於應用程序的設計,我不想使用avplayerviewcontroller。預先感謝您的幫助。AVPlayer強制全屏風景模式

+1

當視頻播放和全屏,設置'supportedInterfaceOrientations'僅景觀 –

+0

這工作非常久遠下面給出了答案,可你也看到我的意見給它一個問題關閉全屏實現? –

+0

澄清:您的問題是當您關閉全屏播放器時 - 較小的播放器不知道繼續播放和從哪裏播放? –

回答

3

偉大的問題!允許AVPLayerLayer進入全屏顯示非常重要。相當數量的應用程序配置爲單個視圖處理縱向和橫向,只是爲了顯示全屏視頻?請。

變換和幀操作可以解決這個問題:

extension CGAffineTransform { 

    static let ninetyDegreeRotation = CGAffineTransform(rotationAngle: CGFloat(M_PI/2)) 
} 

extension AVPlayerLayer { 

    var fullScreenAnimationDuration: TimeInterval { 
     return 0.15 
    } 

    func minimizeToFrame(_ frame: CGRect) { 
     UIView.animate(withDuration: fullScreenAnimationDuration) { 
      self.setAffineTransform(.identity) 
      self.frame = frame 
     } 
    } 

    func goFullscreen() { 
     UIView.animate(withDuration: fullScreenAnimationDuration) { 
      self.setAffineTransform(.ninetyDegreeRotation) 
      self.frame = UIScreen.main.bounds 
     } 
    } 
} 

設置AVPlayerLayer的改變它的父的幀的幀。將原始幀保存在視圖子類中,以將AVPLayerLayer最小化到原來的位置。這允許自動佈局。

重要 - 只有當玩家處於視圖子類中心時纔有效。

不完整的例子:

class AVPlayerView: UIView { 

    fileprivate var avPlayerLayer: AVPlayerLayer { 
     return layer as! AVPlayerLayer 
    } 

    fileprivate var hasGoneFullScreen = false 
    fileprivate var isPlaying = false 
    fileprivate var originalFrame = CGRect.zero 

    func togglePlayback() { 
     if !hasGoneFullScreen { 
      originalFrame = frame 
      hasGoneFullScreen = true 
     } 

     isPlaying = !isPlaying 
     if isPlaying { 
      avPlayerLayer.goFullscreen() 
      avPlayerLayer.player?.play() 
     } else { 
      avPlayerLayer.player?.pause() 
      avPlayerLayer.minimizeToFrame(originalFrame) 
     } 
    } 
} 
3

在我看來,你應該創建一個FullScreenViewController,它總是被迫支持風景。然後,當按下「全屏」按鈕並將AVPlayer實例傳遞給該視圖控制器時,從當前視圖控制器呈現該視圖控制器,然後爲AVPlayerLayer設置幀並繼續播放。解散後,這將恢復正常,我的意思是你的「肖像」模式。

+0

這是我想到的以及可能的解決方案..希望看看有沒有其他的方法。 –

+0

我用FullScreenViewController試過這個解決方案,並傳遞了具有AVPlayerLayer以及自定義控件UIView的容器UIView。到現在爲止還挺好。然而,點擊關閉全屏後,我關閉了FullScreenViewController,但播放器不會在我的演示視圖中播放。我如何在FullScreenViewController中實現關閉全屏?因爲我認爲自從它被解散後,它的觀點,即玩家容器視圖被取消分配。 –

+0

部分代碼:'FullScreenViewController * controller = [[FullScreenViewController alloc] init]; controller.view = self.playerContainer; //容器uiview [self presentViewController:controller animated:YES completion:nil];' –