使用 iOS swift 的 AVPlayer 在横向模式下不是全屏

AVPlayer not full screen in landscape mode using iOS swift

我将视频视图设置为全屏。但是在模拟器中玩的时候,不是运行全屏。

此问题仅适用于 iPad,不适用于 iPhone。

这是我的代码:

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(true)

    let bundle: Bundle = Bundle.main
    let videoPlayer: String = bundle.path(forResource: "normalnewer", ofType: "mp4")!
    let movieUrl : NSURL = NSURL.fileURL(withPath: videoPlayer) as NSURL
    //        var fileURL = NSURL(fileURLWithPath: "/Users/Mantas/Desktop/123/123/video-1453562323.mp4.mp4")
    playerView = AVPlayer(url: movieUrl as URL)

    NotificationCenter.default.addObserver(self,selector: #selector(playerItemDidReachEnd),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,object: self.playerView.currentItem) // Add observer

            var playerLayer=AVPlayerLayer(player: playerView)
//        self.avPlayerLayer.playerLayer = AVLayerVideoGravityResizeAspectFill


    playerLayer.frame = viewVideo.bounds
//        self.playerLayer.frame = self.videoPreviewLayer.bounds

    viewVideo.layer.addSublayer(playerLayer)




    playerView.play()

    UserDefaults.standard.set("normalnewer", forKey: "video")




}

我试过在目标的常规中检查横向模式。 通过以下线程: how to play a video in fullscreen mode using swift ios?

Setting device orientation in Swift iOS

但是这些都没有解决我的问题。 这是一个截图。

有人可以帮我解决这个问题吗?

花了一些时间仔细查看 Storyboard 后,我尝试将填充更改为 Aspect fill & fit 并解决了问题:)

我看到您解决了问题,但我注意到您使用的是 AVPlayerLayer。方向旋转由 AVPlayerViewController 处理,但不由使用播放器层的自定义视图处理。能够在不旋转设备的情况下将图层全屏显示是很有用的。我在别处回答过这个问题,但我也把它放在这里。

变换和帧操作可以解决这个问题:

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)
        }
    }
}