仅肖像应用中的AVPlayerViewController全屏旋转行为

toe*_*mat 4 iphone xcode ios swift

当将AVPlayerViewController嵌入到仅纵向iOS应用程序中时,如果在设备保持横向放置的状态下全屏播放视频,则播放器退出全屏显示时,该应用程序可能会卡在怪异的布局中。

这是错误还是我做错了什么?

以下是使用Xcode 9.4.1,swift 4,iOS 11.4,模拟器或物理设备在干净项目中进行重现的方法。

ViewController.swift

override func viewDidLoad() {
    super.viewDidLoad()

    //Create the player and add as child view controller
    let playerVC = AVPlayerViewController()
    self.addChildViewController(playerVC)

    //Place player's view in self
    playerVC.view.frame = CGRect(x: 10, y: 40, width: 355, height: 200)
    self.view.addSubview(playerVC.view)

    //Load example video
    playerVC.player = AVPlayer(url: URL(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")!)
}
Run Code Online (Sandbox Code Playgroud)

正常工作方式:

  • 播放视频,全屏播放
  • 旋转到风景,视频旋转
  • 全屏关闭,无论屏幕或设备方向如何,应用都将返回纵向
  • 例如:https//imgur.com/a/MPFmzyH

如何中断:

  • 播放视频,将设备旋转到横向(屏幕不旋转)
  • 打全屏
  • 退出全屏
  • 屏幕断裂,旋转不固定
  • 例如:https//imgur.com/a/hDdmu20

小智 5

当播放器保持全屏显示时,您将进入View Controller的viewWillApper。因此,在viewWillAppear中,尝试将窗口框架设置为等于屏幕边界。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    appDelegate.window?.rootViewController?.view.frame = UIScreen.main.bounds
}
Run Code Online (Sandbox Code Playgroud)

  • 这完全解决了问题,并且不会引起任何怪异的UI垃圾。谢谢您找到这个问题并借给您知识,伊万! (2认同)