我想在AVPlayerViewController中播放本地视频,但未找到完成按钮的单击事件。在AVPlayerViewController中完成按钮单击事件
我的视频能够在AVPlayerViewController中播放,但我没有找到下一个按钮,上一个按钮和完成按钮单击事件。
我想在AVPlayerViewController中播放本地视频,但未找到完成按钮的单击事件。在AVPlayerViewController中完成按钮单击事件
我的视频能够在AVPlayerViewController中播放,但我没有找到下一个按钮,上一个按钮和完成按钮单击事件。
您可以查看此Stackoverflow post,这里是github's project作为参考。你将不得不使用:
self.showsPlaybackControls = true
官方没有完成按钮点击事件,但苹果的工程师说一下here。
至于我的研究,我发现有一个但真正间接的方式来获得一个事件,如果单击完成按钮。
我发现AVPlayerViewController的唯一变量,点击完成按钮时改变的是AVPlayerViewController.view.frame
。 首先,view.frame出现在viewController的中心。
如果将它与animated : true
一起显示,它将转到viewController的底部,并返回到中心。完成后点击它回到底部。
如果您使用animated : false
进行展示,只会发生2处更改:当您开始播放视频时,frame将位于viewController的中心,而在底部单击完成时。
因此,如果在present(PlayerViewController, animated : true)
的回调中将观察者添加到AVPlayerViewController.view.frame
,您将只能看到一个观察者的呼叫,右击完成按钮并且视频视图将在屏幕之外。
在我的情况下,AVPlayerViewController模态地呈现动画。下面的代码为我工作:
雨燕3.0
override func viewDidLoad()
{
super.viewDidLoad()
let videoURL = NSURL(fileURLWithPath:Bundle.main.path(forResource: "MyVideo", ofType:"mp4")!)
let player = AVPlayer(url: videoURL as URL)
present(playerViewController, animated: false) {() -> Void in
player.play()
self.playerViewController.player = player
self.playerViewController.addObserver(self, forKeyPath: #keyPath(UIViewController.view.frame), options: [.old, .new], context: nil)
}}
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?)
{
print(self.playerViewController.view.frame)
//Player view is out of the screen and
//You can do your custom actions
}
而且,我发现,当您单击完成,AVPlayerViewController没有被驳回,你可以看到它在ParentViewController.presentedViewController
,所以你不能添加观察员这个属性
您可以使用
override func viewWillAppear(_ animated: Bool) { print("Done Button Click Event") }
我你的班级。当AVPlayerViewController将消失,然后viewWillAppear函数调用,你可以在这里完成你的工作。
如果你使用的是AVPlayerViewController Class,那么你可以使用这个func。
override func viewWillDisappear(_ animated: Bool) { <#code#> }
我有同样的问题,我发现了另一个窍门(可与YoutubePlayer迅速框架,播放视频的网页视图,但你也许能使其适应其他用途)。
在我的情况下,按Done
按钮并按下全屏视频播放器Pause
按钮上YoutubePlayer一个pause
事件两个结果。然而,随着视频在不同的窗口中播放,我的子类我的应用程序的主窗口,并推翻了becomeKey
和resignKey
功能来存储我的窗口是否是关键窗口或没有,这样的:
class MyWindow:UIWindow {
override func becomeKey() {
Services.appData.myWindowIsKey = true
}
override func resignKey() {
Services.appData.myWindowIsKey = false
}
}
一旦我有,当视频状态进入暂停时,我可以检查我的窗口是否为按键 - 当按下Done
按钮时,我的窗口是的关键窗口,我可以关闭我的视频视图控制器,并且在Pause
的情况下我的窗口是不是的关键窗口,所以我什么都不做。
我已经完成了Done
按钮点击事件从AVPlayerViewController
。
首先,创建一个类似波纹管
extension Notification.Name {
static let kAVPlayerViewControllerDismissingNotification = Notification.Name.init("dismissing")
}
的Notification.Name
扩展现在,创建的AVPlayerViewController
的延伸和覆盖viewWillDisappear
像波纹管
// create an extension of AVPlayerViewController
extension AVPlayerViewController {
// override 'viewWillDisappear'
open override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// now, check that this ViewController is dismissing
if self.isBeingDismissed == false {
return
}
// and then , post a simple notification and observe & handle it, where & when you need to.....
NotificationCenter.default.post(name: .kAVPlayerViewControllerDismissingNotification, object: nil)
}
}
这仅是基本的功能,处理完成按钮'S事件。
快乐编码...
这是从回答一个小小的改进的@vmchar:
我们可以使用.isBeingDismissed方法,以确保AVPlayerViewController被关闭,而不是分析框架。
...
let videoURL = NSURL(fileURLWithPath:"video.mp4")
let player = AVPlayer(url: videoURL as URL)
present(playerViewController!, animated: false) {() -> Void in
player.play()
self.playerViewController!.player = player
self.playerViewController!.addObserver(self, forKeyPath:#keyPath(UIViewController.view.frame), options: [.old, .new], context: nil)
...
然后观察值
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?)
{
if (playerViewController!.isBeingDismissed) {
// Video was dismissed -> apply logic here
}
}
太谢谢你了! @vmchar,拯救我整整一天!除了你的任何地方,找不到正确的答案! – Jerome
哈哈完美 –
这工作非常甜蜜,谢谢! – Jason