Yog*_*tel 13 objective-c ios avplayer avplayerviewcontroller
我想在AVPlayerViewController中播放本地视频,但没有找到完成按钮的点击事件.
我的视频可以在AVPlayerViewController中播放但我没有找到下一个按钮,上一个按钮和完成按钮点击事件.
vmc*_*har 16
正式没有完成按钮点击事件,Apple的工程师在这里说了这件事.
至于我的研究,我发现如果单击Done Button,有一种但实际上是间接的方式来获取事件.
我发现AVPlayerViewController的唯一变量是单击完成按钮时更改的是AVPlayerViewController.view.frame.首先,view.frame出现在viewController的中心.
如果你带它,animated : true它会到viewController的底部,然后回到中心.单击完成后,它会返回到底部.
如果你出现它只animated : false会有2个变化:当你开始播放视频时,框架将位于viewController的中心,而当单击完成时,框架将位于底部.
因此,如果您AVPlayerViewController.view.frame在回调中添加观察者,present(PlayerViewController, animated : true)您将只获得观察者的一次调用,当单击完成按钮并且视频视图将不在屏幕外时.
在我的例子中,AVPlayerViewController以模态方式呈现动画.以下代码对我有用:
Swift 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
}
Run Code Online (Sandbox Code Playgroud)
此外,我发现当你点击完成时,AVPlayerViewController没有被解雇,你可以看到它ParentViewController.presentedViewController,所以你不能添加观察者到这个属性
Vat*_*kla 13
我这样做是为了获得Done按钮点击事件AVPlayerViewController.
首先,创建一个Notification.Name像bellow一样的扩展
extension Notification.Name {
static let kAVPlayerViewControllerDismissingNotification = Notification.Name.init("dismissing")
}
Run Code Online (Sandbox Code Playgroud)
现在,创建一个扩展名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)
}
}
Run Code Online (Sandbox Code Playgroud)
这只是处理按钮事件的基本功能.
快乐的编码......
目标 c 版本:(基于 vmchar 答案)
- (void)viewDidLoad
{
[super viewDidLoad];
NSURL *url = [NSURL fileURLWithPath:path];
AVPlayer *player = [AVPlayer playerWithURL:url];
AVPlayerViewController *AVPlayerVc = [[AVPlayerViewController alloc] init];
if (AVPlayerVc) {
[self presentViewController:AVPlayerVc animated:YES completion:^{
[player play];
AVPlayerVc.player = player;
[AVPlayerVc addObserver:self forKeyPath:@"view.frame" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil];
}];
}
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"view.frame"]) {
CGRect newValue = [change[NSKeyValueChangeNewKey]CGRectValue];
CGFloat y = newValue.origin.y;
if (y != 0) {
NSLog(@"Video Closed");
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mun*_*hil -6
你可以看看这个Stackoverflow 帖子,这里有一个github 的项目可供参考。你将不得不使用这个:
self.showsPlaybackControls = true
Run Code Online (Sandbox Code Playgroud)
另请查看Apple 的文档
| 归档时间: |
|
| 查看次数: |
9017 次 |
| 最近记录: |