AVPlayer强制横向模式用于全屏

Kin*_*vid 2 iphone video ios avplayer avplayerlayer

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

Eri*_*ong 5

好问题!允许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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

设置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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)