【问题标题】:Place AVPlayerViewController inside UIView将 AVPlayerViewController 放在 UIView 中
【发布时间】:2017-02-01 11:03:43
【问题描述】:

目前我有一个底部有四个控件的对话视图。每个控件都在对话框中加载不同的视图。其中一个控件是在对话视图中设置AVPlayer 并正在播放它。不幸的是,AVPlayer 本身没有播放控件。

AVPlayerViewController 有播放控件。 是否可以将一个 AVPlayerViewController 放在一个 UIView 这样它就不会作为新屏幕启动?我想要将它放在我的UIView 中,以便一切都在我的拨号盘中进行。

【问题讨论】:

    标签: ios swift swift3 avplayer avplayerviewcontroller


    【解决方案1】:

    您可以初始化 AVPlayerViewController 并将其作为子视图添加到您的 ViewController 中,并将其作为子视图插入。

    [self addChildViewController:yourPlayerViewController];
    [self.view addSubview:yourPlayerViewController.view];
    [yourPlayerViewController didMoveToParentViewController:self];
    

    并删除它:

    [yourPlayerViewController willMoveToParentViewController:nil];
    [yourPlayerViewController.view removeFromSuperview];
    [yourPlayerViewController removeFromParentViewController];
    

    编辑 SWIFT 方法: Check here for Swift

    【讨论】:

      【解决方案2】:

      我正在使用 Swift 3.2 / Xcode 9.2 / iOS 11

      这是通过 9 个简单步骤完成的方法。步骤在每一行上面都有说明

      **确保您import AVKit 有权访问 AVPlayerViewController 否则您将无法使用它

      // 1. to have access to the AVPlayerViewController import AVKit
      import AVKit
      
       // 2. create your class properties
      var videoUrl: URL?
      var player: AVPlayer?
      let avPVC = AVPlayerViewController()
      
      override func viewDidLoad() {
              super.viewDidLoad()
      
              // 3. make sure the url your using isn't nil
              guard let videoUrl = self.videoUrl else { return }
      
              // 4. init an AVPlayer object with the url then set the class property player with the AVPlayer object
              self.player = AVPlayer(url: videoUrl)
      
              // 5. set the class property player to the AVPlayerViewController's player
              avPVC.player = self.player
      
              // 6. set the the parent vc's bounds to the AVPlayerViewController's frame
              avPVC.view.frame = self.view.bounds
      
              // 7. the parent vc has a method on it: addChildViewController() that takes the child you want to add to it (in this case the AVPlayerViewController) as an argument
              self.addChildViewController(avPVC)
      
              // 8. add the AVPlayerViewController's view as a subview to the parent vc
              self.view.addSubview(avPVC.view)
      
              // 9. on AVPlayerViewController call didMove(toParentViewController:) and pass the parent vc as an argument to move it inside parent
              avPVC.didMove(toParentViewController: self)
      
      }
      

      【讨论】:

        【解决方案3】:

        SWIFT 4 - 子视图方法

        初始方法工作正常,但是当我真的只想要一个子视图时,我觉得视图控制器方法看起来很乱。所以,大多数时候我在自定义视图中播放视频(而不是使用整个 AVPlayerViewController)。

        我使用这种方法在完全填充现有视图的子视图中显示视频。在下面的示例中,urlToVideo 是您要播放的视频的 URL,existingView 是我们要放置新视图的视图(作为子视图) .

        首先,在一个新的 VideoPlayerView.swift 文件中创建一个 VideoPlayerView 类,使用这个,直接从Apple's website 复制/粘贴,除了我叫它VideoPlayerView 而不是 PlayerView

        import Foundation
        import UIKit
        import AVFoundation
        
        /// A simple `UIView` subclass that is backed by an `AVPlayerLayer` layer.
        class VideoPlayerView: UIView {
            var player: AVPlayer? {
                get {
                    return playerLayer.player
                }
        
                set {
                    playerLayer.player = newValue
                }
            }
        
            var playerLayer: AVPlayerLayer {
                return layer as! AVPlayerLayer
            }
        
            override class var layerClass: AnyClass {
                return AVPlayerLayer.self
            }
        }
        

        然后,当我想播放视频时,我创建子视图并播放它:

        let player = AVPlayer(url: urlToVideo)
        
        let playerFrame = CGRect(x: 0, y: 0, width: existingView.frame.width, height: existingView.frame.height)
        let videoPlayerView = VideoPlayerView(frame: playerFrame)
        videoPlayerView.player = player
        existingView.addSubview(videoPlayerView)
        
        player.play()
        

        【讨论】:

          【解决方案4】:

          我的解决方案是让您的视图像画布一样,基本上在其上绘制 AVPlayerViewController:

          @IBOutlet weak var layerVideoView: UIImageView!
              guard let url = Bundle.main.path(forResource: "santana", ofType: "mp4") else { return debugPrint("video not found") }
              let path = URL(fileURLWithPath: url)
              
              let player = AVPlayer(url: path)
              let playerController = AVPlayerViewController()
              playerController.player = player
              playerController.view.frame = CGRect(x: layerVideoView.frame.origin.x, y: layerVideoView.frame.origin.y, width: layerVideoView.frame.width, height: layerVideoView.frame.height)
              self.addChild(playerController)
              self.view.addSubview(playerController.view)
          

          LayerVideoView 是一个图像视图,但如果适合,您可以只使用 UIView。 将 Storyboard 中的约束添加到您的视图中很重要,因为您的视频播放器将模仿您的视图的形状。

          【讨论】:

            猜你喜欢
            • 2018-06-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-08
            相关资源
            最近更新 更多