将 AVPlayerViewController 放在 UIView 中
Place AVPlayerViewController inside UIView
目前我有一个底部有四个控件的对话视图。每个控件都在对话中加载不同的视图。其中一个控件正在对话视图中设置 AVPlayer
并正在播放它。不幸的是 AVPlayer
本身没有播放控件。
AVPlayerViewController
怎么会有回放控制。 可不可以把a AVPlayerViewController
放在a UIView
里面让它不启动作为新屏幕? 我想将它放在我的 UIView
中,这样一切都在我的 dialgoue 中进行。
您可以初始化 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
SWIFT 4 - 子视图方法
初始方法工作正常,但当我真的只想要一个子视图时,我觉得视图控制器方法看起来很乱。所以,大多数时候我在自定义视图中播放视频(而不是使用整个 AVPlayerViewController)。
我使用此方法在完全填充现有视图的子视图中显示视频。在下面的示例中,urlToVideo 是您要播放的视频的 URL,而 existingView 是我们要播放的视图将我们的新视图放入(作为子视图)。
首先,在新的VideoPlayerView.swift文件中新建一个VideoPlayerViewclass,用这个,就是直接从 Apple's website copy/paste,除了我称它为 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()
我正在使用 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)
}
我的解决方案是让您的视图像 canvas 并基本上在其上绘制 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。
将情节提要中的约束添加到您的视图很重要,因为您的视频播放器将模仿您的视图的形状。
目前我有一个底部有四个控件的对话视图。每个控件都在对话中加载不同的视图。其中一个控件正在对话视图中设置 AVPlayer
并正在播放它。不幸的是 AVPlayer
本身没有播放控件。
AVPlayerViewController
怎么会有回放控制。 可不可以把a AVPlayerViewController
放在a UIView
里面让它不启动作为新屏幕? 我想将它放在我的 UIView
中,这样一切都在我的 dialgoue 中进行。
您可以初始化 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
SWIFT 4 - 子视图方法
初始方法工作正常,但当我真的只想要一个子视图时,我觉得视图控制器方法看起来很乱。所以,大多数时候我在自定义视图中播放视频(而不是使用整个 AVPlayerViewController)。
我使用此方法在完全填充现有视图的子视图中显示视频。在下面的示例中,urlToVideo 是您要播放的视频的 URL,而 existingView 是我们要播放的视图将我们的新视图放入(作为子视图)。
首先,在新的VideoPlayerView.swift文件中新建一个VideoPlayerViewclass,用这个,就是直接从 Apple's website copy/paste,除了我称它为 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()
我正在使用 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)
}
我的解决方案是让您的视图像 canvas 并基本上在其上绘制 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。 将情节提要中的约束添加到您的视图很重要,因为您的视频播放器将模仿您的视图的形状。