2016-07-25 66 views

回答

7

官方没有完成按钮点击事件,但苹果的工程师说一下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,所以你不能添加观察员这个属性

+0

太谢谢你了! @vmchar,拯救我整整一天!除了你的任何地方,找不到正确的答案! – Jerome

+0

哈哈完美 –

+0

这工作非常甜蜜,谢谢! – Jason

0

您可以使用

override func viewWillAppear(_ animated: Bool) { print("Done Button Click Event") }

我你的班级。当AVPlayerViewController将消失,然后viewWillAppear函数调用,你可以在这里完成你的工作。

如果你使用的是AVPlayerViewController Class,那么你可以使用这个func。

override func viewWillDisappear(_ animated: Bool) { <#code#> }

0

我有同样的问题,我发现了另一个窍门(可与YoutubePlayer迅速框架,播放视频的网页视图,但你也许能使其适应其他用途)。

在我的情况下,按Done按钮并按下全屏视频​​播放器Pause按钮上YoutubePlayer一个pause事件两个结果。然而,随着视频在不同的窗口中播放,我的子类我的应用程序的主窗口,并推翻了becomeKeyresignKey功能来存储我的窗口是否是关键窗口或没有,这样的:

class MyWindow:UIWindow { 
    override func becomeKey() { 
     Services.appData.myWindowIsKey = true 
    } 

    override func resignKey() { 
     Services.appData.myWindowIsKey = false 
    } 
} 

一旦我有,当视频状态进入暂停时,我可以检查我的窗口是否为按键 - 当按下Done按钮时,我的窗口的关键窗口,我可以关闭我的视频视图控制器,并且在Pause的情况下我的窗口是不是的关键窗口,所以我什么都不做。

2


我已经完成了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事件。

快乐编码...

+0

如何处理暂停/前进/后退按钮被点击时? – pkc456

+0

@ pkc456,在我看来,你应该在UIViewController中使用AVPlayerLayer创建自定义播放器,这样你就可以轻松处理这些事件。 – Vats

0

这是从回答一个小小的改进的@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 
    } 
}