AVPlayer强制横向模式全屏

时间:2016-05-16 09:02:01

标签: ios iphone video avplayer avplayerlayer

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

2 个答案:

答案 0 :(得分:3)

在我看来,你应该创建一个FullScreenViewController,它被强制始终支持横向。按下"全屏"然后显示当前视图控制器。按钮并将AVPlayer实例传递给它,然后为AVPlayerLayer设置框架并继续播放。解雇后,它会恢复正常,我的意思是你的肖像"模式。

答案 1 :(得分: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)
        }
    }
}