【问题标题】:AVKit.AVPlayerViewController - controls not visible with iOS11 and upwardsAVKit.AVPlayerViewController - 控件在 iOS11 及更高版本中不可见
【发布时间】:2018-10-05 13:20:05
【问题描述】:

我有一个带有控件的 videoPlayer。 这些在 iOS11 + 中不可见 到iOS10都没问题

这是一个带有 iPhone8 模拟器的演示

iPhone 8 Demo

这是一个带有 iPhoneX 模拟器的演示。控件未显示在播放器底部

iPhone X Demo

我相信这与新的安全区有很大关系。我们使用 contentOffset(下图)从顶部偏移。更改值没有区别。 没有可见的控件

这是我用来配置播放器的以下代码:

let statusBarHeight: CGFloat = 20
let contentOffset: CGFloat = 50

func setupPlayerView() {
        containerView.addSubview(moviePlayerController.view)
        moviePlayerController.videoGravity = AVLayerVideoGravity(rawValue: AVLayerVideoGravity.resizeAspect.rawValue)
        moviePlayerController.view.sizeToFit()
        moviePlayerController.showsPlaybackControls = true

        moviePlayerController.view.translatesAutoresizingMaskIntoConstraints = false

        if #available(iOS 11.0, *) {
            moviePlayerController.view.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: contentOffset).isActive = true
        } else {
            moviePlayerController.view.topAnchor.constraint(equalTo: topAnchor, constant: statusBarHeight + contentOffset).isActive = true
        }
        NSLayoutConstraint.activate([
            moviePlayerController.view.bottomAnchor.constraint(equalTo: bottomAnchor),
            moviePlayerController.view.leftAnchor.constraint(equalTo: leftAnchor),
            moviePlayerController.view.rightAnchor.constraint(equalTo: rightAnchor)
        ])
    }

showsPlaybackControls 设置为 True,不过这是默认设置

有其他人遇到过这个问题吗?

【问题讨论】:

  • 我无法发表评论。这没有多大意义。
  • 好的,将其添加到我的答案中。

标签: swift safearealayoutguide avkit


【解决方案1】:

您的代码总是错误的。即使在 iOS 10 上,控件也位于屏幕底部,远离电影。正确的做法是获取视频轨道的naturalSize,并用它来配置播放器视图的纵横比,使播放器视图为电影的大小。现在控件将出现在影片的底部,而不是屏幕的底部。

另一个问题是你所做的完全是非法的。您不能只创建一个 AVPlayerViewController,获取视图控制器的视图并将该视图的内容放入带有addSubview 的界面中。为了使视图控制器成为self(当前视图控制器)的子视图控制器,您需要做一个严格的舞蹈——而您并没有在做舞蹈。这是一个工作示例:

    let url = // whatever
    let player = AVPlayer(url:url)
    let av = AVPlayerViewController()
    av.player = player
    av.view.frame = // whatever
    self.addChild(av) // <—- LOOK!
    self.view.addSubview(av.view)
    av.didMove(toParent:self) // <— LOOK!

(请注意,这是 Swift 4.2。)

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 2020-07-18
  • 2013-05-18
  • 2014-08-18
相关资源
最近更新 更多