【问题标题】:Playback buttons do not appear in an AVPlayer after adding a layer - iOS 16添加图层后,播放按钮不会出现在 AVPlayer 中 - iOS 16
【发布时间】:2022-11-02 23:31:24
【问题描述】:

我正在使用 AVPlayer 来展示视频。该应用程序只有一个 .mp4,但对于不同的用例,需要翻转相同的视频。

按钮在那里并且功能齐全,您可以按播放和 15 秒前进/后退按钮,但它们不会出现在屏幕上(附图中的第 4 个视频)

问题似乎是我添加的翻转层覆盖了新的布局按钮。

我正在考虑的潜在解决方法是在将视频添加到播放器之前翻转视频。

你知道是否有一个简单的解决方案吗? 也许有一种简单的方法可以保持 iOS 15 的播放按钮布局?

该应用程序用于翻转视频的代码如下:

  @IBAction func pressButton(_ sender: Any) {
    guard let path = Bundle.main.path(forResource: "sample-5s", ofType:"mp4") else {
       return
    }
    let avPlayer = AVPlayer(url: URL(fileURLWithPath: path))
    let avPlayerController = AVPlayerViewController()
    
    present(avPlayerController, animated: true, completion: {
   
      let flippedLayer = AVPlayerLayer(player: avPlayer)
      let transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
      flippedLayer.frame = (avPlayerController as UIViewController).view.frame
      flippedLayer.setAffineTransform(transform)
      (avPlayerController as UIViewController).view.layer.addSublayer(flippedLayer)
     
      avPlayerController.player = avPlayer
      avPlayer.play()
    })
  }

【问题讨论】:

  • 你有没有深究这件事?我遇到了同样的问题,默认情况下似乎无法显示播放器控件。
  • @ChrisHefferman 不,我们无法修复它。我们试图将图层推到底部但没有奏效,还尝试了更多不同的东西,但没有奏效。我们也在 Apple 开了一张票,但我们没有得到任何回应(附件)。我们最终在外面创建了单独的视频,并用 QuickTime 翻转它们。 developer.apple.com/forums/thread/709485
  • 感谢您的回复,我也从未找到解决方案,最终决定在 UI 顶部显示一个按钮,如果单元格是一个视频,该视频会消失并在点击时播放视频。遗憾的是,现在默认情况下没有显示 - 我也在一个开发者论坛上发现了这个,我一直在关注:developer.apple.com/forums/thread/711360

标签: swift avplayer avplayerviewcontroller avplayerlayer ios16


【解决方案1】:

找到了解决方案。这就是在父视图控制器中添加AVPlayerViewController。假设您在viewController 中有一个AVPlayerViewController。因此,首先在viewDidLoad 中确保将其添加为子项。

var playerController = AVPlayerViewController()
lazy var playerBaseView: UIView = {
        let view = UIView()
        view.backgroundColor = .clear
        return view
}()

override func viewDidLoad() {
    // Make your player parent view constraints or do it on Storyboard
    playerBaseView.snp.makeConstraints { (make) in
       make.edges.equalTo(view.safeAreaLayoutGuide.snp.edges)
    }

   addChild(playerController) // Add as a child
   playerBaseView.addSubview(playerController.view)

   // Make your playerController view constraints or do it on Storyboard
   playerController.view.snp.makeConstraints { (make) in
       make.edges.equalToSuperview()
   }
}

【讨论】:

  • 感谢分享,我们的堆栈不允许在没有大修的情况下以这种方式添加它,所以我们决定在顶部贴一个按钮,但我在开发者论坛上也看到了类似的建议,所以肯定是取决于您的视图和子视图的布局方式。谢谢
  • 谢谢你。只是为了澄清其他人:这里的重要行是addChild(playerController)(或ObjC中的[self addChildViewController:playerController])。
  • 但是我发现您仍然需要点击播放器视图一次才能显示控件。有没有办法让它们立即出现?
  • 我没有检查播放器控制器一。我也会检查的
【解决方案2】:

对于 Swift 用户界面

CustomVideoPlayer()
   .compositingGroup()




struct CustomVideoPlayer : UIViewControllerRepresentable {

 var player: AVPlayer

 func makeUIViewController(context: UIViewControllerRepresentableContext<CustomVideoPlayer>) -> AVPlayerViewController {
     
     let controller = AVPlayerViewController()
     controller.player = player
     return controller

 }

 func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<CustomVideoPlayer>) {
 }

在 IOS 16 Swift UI 中为我解决了问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 2022-09-25
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多