在AVPlayerViewController中完成按钮单击事件

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)

这只是处理按钮事件的基本功能.

快乐的编码......


Zou*_*ssi 5

目标 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 的文档