【问题标题】:AVPlayer not full screen in landscape mode using iOS swift使用iOS swift的AVPlayer在横向模式下不能全屏
【发布时间】:2017-08-25 12:23:06
【问题描述】:

我将视频视图设置为全屏。但是,在模拟器中播放时,它并没有全屏运行。

此问题仅适用于 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?

Play video fullscreen in landscape mode, when my entire application is in lock in portrait mode

Setting device orientation in Swift iOS

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

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

【问题讨论】:

    标签: ios iphone swift avplayer


    【解决方案1】:

    我看到您解决了您的问题,但我注意到您使用的是 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)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多