swift 3 - 旋转到横向时全屏播放视频

Posted

技术标签:

【中文标题】swift 3 - 旋转到横向时全屏播放视频【英文标题】:swift 3 - play video in fullscreen when rotated to landscape 【发布时间】:2017-03-22 09:18:13 【问题描述】:

我有一个容器视图,可以在设备为纵向时在其中播放视频。 我希望视频在设备旋转时自动全屏播放。 我试过这段代码来检测设备何时旋转,但它不会将容器更改为全屏

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) 

    if (UIDevice.current.orientation.isLandscape) 

        videoContainerView.frame = self.view.frame
       // self.videoContainerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) // this didn't work to....
        print("Device is landscape")
    
    else
        print("Device is portrait")
    


视频在 avplayer 播放器上。 谢谢

【问题讨论】:

May by layoutConstraints 可以帮助您解决问题吗?只需将您的 videoView 绑定到 containerView 他们已经绑定在一起了…… 我找到了一个解决方案,方法是将 AvplayerController 设置为旋转时的屏幕大小。现在我只需要找到一种方法来关闭导航栏 【参考方案1】:

我找到了另一种更好的方法来解决这个问题,因为这样控件是可见的。主要思想是将 AVPlayerViewController 对象移动到一个新的 subView 并将它的框架设置为全屏。这是我的代码..

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) 

    if (UIDevice.current.orientation.isLandscape) 


                    DispatchQueue.main.async 
                        self.playerController.player = self.player
                        self.addChildViewController(self.playerController)
                        self.view.addSubview(self.playerController.view)
                        self.playerController.view.frame = self.view.frame

        
        print("Device is landscape")
    

当设备旋转回纵向时,将此子视图添加到前一帧并再次设置它的大小。这是我的代码。

else
        print("Device is portrait")
        videoContainerView.addSubview(playerController.view)
        playerController.view.frame = videoContainerView.bounds
        controllsContainerView.frame = videoContainerView.bounds
    

希望对您有所帮助。祝你好运!

【讨论】:

【参考方案2】:

好的。所以我设法通过将视频添加到 AVPlayerLayer 并在设备为横向时将其大小设置为视图来全屏播放视频。

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) 

    if (UIDevice.current.orientation.isLandscape) 

                    DispatchQueue.main.async 
                       self.view.didAddSubview(self.controllsContainerView)
                       self.layer = AVPlayerLayer(player: self.player!)
                        self.layer?.frame = self.view.frame
                        self.layer?.videoGravity = AVLayerVideoGravityResizeAspectFill
                        self.view.layer.addSublayer(self.layer!)

        
        print("Device is landscape")
    

当 UIDevice.cuurent.orientation.islandscape == false 我删除 subLayer 并将视图设置回 videoContainer 边界。

else
        print("Device is portrait")
        movie.view.frame = videoContainerView.bounds
        controllsContainerView.frame = videoContainerView.bounds
        self.layer?.removeFromSuperlayer()


    

希望它对任何人都有帮助。

【讨论】:

【参考方案3】:

这对我有用,因为我使用的是 AVQueuePlayer:

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) 
    super.willTransition(to: newCollection, with: coordinator)
    DispatchQueue.main.async 
        if (UIDevice.current.orientation.isLandscape) 
            self.landScapeAVController           = AVPlayerViewController()
            self.addChild(self.landScapeAVController!)
            self.landScapeAVController!.player   = self.queuePlayer
            self.landScapeAVController!.view.tag = 999
            self.view.addSubview(self.landScapeAVController!.view)
         else 
            let topView                          = self.view.viewWithTag(999)
            topView?.removeFromSuperview()
            self.landScapeAVController?.removeFromParent()
        
    

【讨论】:

以上是关于swift 3 - 旋转到横向时全屏播放视频的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native youtube iframe 中切换到全屏(单击 YouTube 播放器 gui 上的全屏按钮旋转到横向)?

swift - 当设备旋转到横向(iPhone/iPad)时,如何让 UIView 变成全屏?

如何在全屏模式下开始电影或在横向播放时重新调整播放器宽度?

如何在 Android WebView 中以横向全屏播放视频?

关闭 MPMoviePlayerViewController 的全屏模式时出现问题

检测以纵向或横向全屏播放的视频