首页 文章

AVPlayer强制横向模式全屏

提问于
浏览
2

我在我的应用程序中使用AVPlayer播放视频,大约320x200帧 . 该avplayer还有一个自定义的“全屏”按钮作为叠加添加,就像youtube app播放器一样 . 我如何实现它,以便当应用程序处于纵向模式并且用户单击全屏按钮时,视频将旋转到全屏但处于横向模式?我尝试使用转换,它部分工作,因为当它处于全屏模式时,如果用户将设备切换为纵向; avplayer框架突然改变 . 我希望它像youtube应用程序一样工作,即在全屏模式下,即使用户旋转设备也应保持这种状态 . 关闭全屏时才应恢复原始尺寸 . 由于应用程序的设计,我不想使用avplayerviewcontroller . 在此先感谢您的帮助 .

2 回答

  • 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设置帧并继续播放 . 解雇后,它会恢复正常,我的意思是你的“肖像”模式 .

相关问题