将 AVPlayerViewController 放在 UIView 中
Posted
技术标签:
【中文标题】将 AVPlayerViewController 放在 UIView 中【英文标题】:Place AVPlayerViewController inside UIView 【发布时间】:2017-02-01 11:03:43 【问题描述】:目前我有一个底部有四个控件的对话视图。每个控件都在对话框中加载不同的视图。其中一个控件是在对话视图中设置AVPlayer
并正在播放它。不幸的是,AVPlayer
本身没有播放控件。
AVPlayerViewController
有播放控件。 是否可以将一个 AVPlayerViewController
放在一个 UIView
这样它就不会作为新屏幕启动?我想要将它放在我的UIView
中,以便一切都在我的拨号盘中进行。
【问题讨论】:
【参考方案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 中的约束添加到您的视图中很重要,因为您的视频播放器将模仿您的视图的形状。
【讨论】:
以上是关于将 AVPlayerViewController 放在 UIView 中的主要内容,如果未能解决你的问题,请参考以下文章
Swift/AppleTV4:如何将 AVPlayer 功能连接到 AVPlayerViewController?
将 AVPlayerViewController.player 设置为 nil 会中断隐藏式字幕
iOS 8 - 关闭全屏 AVPlayerViewController 时将方向更改回纵向
tvOS 中的 AVPlayerViewController 下拉菜单