AVKit.AVPlayerViewController - 控件在 iOS11 及更高版本中不可见

Posted

技术标签:

【中文标题】AVKit.AVPlayerViewController - 控件在 iOS11 及更高版本中不可见【英文标题】:AVKit.AVPlayerViewController - controls not visible with iOS11 and upwards 【发布时间】: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,不过这是默认设置

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

【问题讨论】:

我无法发表评论。这没有多大意义。 好的,将其添加到我的答案中。 【参考方案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。)

【讨论】:

查看github.com/mattneub/Programming-iOS-Book-Examples/blob/master/… 示例。

以上是关于AVKit.AVPlayerViewController - 控件在 iOS11 及更高版本中不可见的主要内容,如果未能解决你的问题,请参考以下文章