2016-07-25 4 views
5

Ich möchte lokale Video in AVPlayerViewController spielen, aber nicht gefunden Click-Ereignis der Schaltfläche "Fertig".Done-Button-Klick-Ereignis in AVPlayerViewController

Mein Video kann mit AVPlayerViewController abgespielt werden, aber ich habe die nächste Schaltfläche, die vorherige Schaltfläche und das Klickereignis done nicht gefunden.

Antwort

7

Offiziell gibt es keine Schaltfläche Fertig Click-Ereignis, ein Ingenieur von Apple sagte, darüber here.

Zu meiner Recherche habe ich herausgefunden, dass es eine, aber wirklich indirekte Möglichkeit gibt, ein Ereignis zu erhalten, wenn Done Button geklickt wurde.

Ich fand heraus, dass die einzige Variable von AVPlayerViewController, die geändert wird, wenn Sie auf Schaltfläche klicken, ist AVPlayerViewController.view.frame. Zunächst erscheint view.frame in der Mitte des ViewControllers.

Wenn Sie es mit animated : true präsentieren, geht es auf den Boden von ViewController und zurück in die Mitte. Wenn Sie fertig sind, geht es zurück nach unten.

Wenn Sie es mit animated : false präsentieren, wird es nur 2 Änderungen: Frame wird in der Mitte von ViewController sein, wenn Sie mit der Wiedergabe von Video beginnen, und unten, wenn Fertig geklickt wird.

Also, wenn Sie Observer zu AVPlayerViewController.view.frame in den Rückruf an present(PlayerViewController, animated : true) hinzufügen, erhalten Sie nur einen Aufruf des Beobachters, rechts, wenn Sie auf Schaltfläche klicken und Video-Ansicht wird aus dem Bildschirm sein.

In meinem Fall wurde AVPlayerViewController modal mit Animation dargestellt. Code unten arbeitete für mich:

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 
} 

Auch fand ich heraus, wenn Sie auf Fertig klicken, wird AVPlayerViewController nicht entlassen und man kann es in ParentViewController.presentedViewController sehen, so dass Sie nicht Beobachter hinzufügen dieser Eigenschaft kann

+0

Sie zu beobachten, so viel Dank! @vmchar, rette meinen ganzen Tag! Kann nirgends die richtige Antwort finden, außer deins! – Jerome

+0

haha ​​Perfect –

+0

Das hat ziemlich süß funktioniert, danke! – Jason

0

Sie

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

ich benutze in deiner Klasse. Wenn AVPlayerViewController nicht mehr angezeigt wird, rufen Sie viewWillAppear func auf und Sie können Ihre Arbeit hier erledigen.

Wenn Sie die AVPlayerViewController-Klasse verwenden, können Sie diese Funktion verwenden.

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

0

hatte ich das gleiche Problem, und ich fand einen anderen Trick (mit Youtubeplayer schnellen Rahmen arbeitet, die Videos in einer Webansicht spielt, aber man könnte es zur Anpassung an andere Anwendungen in der Lage).

In meinem Fall durch Drücken der Taste Done und Drücken der Pause Taste auf dem Vollbild-Video-Player beiden Ergebnisse in einem pause Ereignisse auf dem Youtubeplayer. Da jedoch das Video in einem anderen Fenster spielt, subclassed ich meine Anwendung im Hauptfenster und überwog die becomeKey und resignKey Funktionen zu speichern, ob mein Fenster der Schlüssel Fenster ist oder nicht, wie folgt aus:

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

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

Sobald ich, dass Ich kann prüfen, ob mein Fenster Schlüssel ist, wenn der Video-Status zu pausieren - wenn die Done Taste gedrückt wurde, ist mein Fenster das Schlüsselfenster und ich kann meine Video-View-Controller entlassen, und in der Pause Fall mein Fenster ist nicht das Schlüsselfenster, also tue ich nichts.

2


Ich habe dies getan, um Done Schaltfläche klicken Ereignis von AVPlayerViewController.

Zu allererst Eine Erweiterung von Notification.Name wie unten

extension Notification.Name { 
static let kAVPlayerViewControllerDismissingNotification = Notification.Name.init("dismissing") 
} 

Erstellen Sie jetzt eine Erweiterung von AVPlayerViewController und viewWillDisappear außer Kraft setzen, wie unten

// 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) 
    } 
} 

dies nur grundlegende Funktionalität ist, dass DONE-Taste des HENKEL VERANSTALTUNG.

glücklich Codierung ...

+0

Wie behandelt man, wenn Pause/Vorwärts/Rückwärts-Tasten angetippt werden? – pkc456

+0

@ pkc456, meiner Meinung nach sollten Sie benutzerdefinierte Player mit AVPlayerLayer in UIViewController erstellen, damit Sie diese Ereignisse problemlos behandeln können. – Vats

0

Dies ist eine kleine Verbesserung aus der Antwort von @vmchar:

Wir können die .isBeingDismissed Methode verwenden, um sicherzustellen, dass die AVPlayerViewController stattdessen geschlossen wird, um den Rahmen zu analysieren.

... 

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) 
... 

dann wird der Wert

override func observeValue(forKeyPath keyPath: String?, 
          of object: Any?, 
          change: [NSKeyValueChangeKey : Any]?, 
          context: UnsafeMutableRawPointer?) 
{ 

    if (playerViewController!.isBeingDismissed) { 
    // Video was dismissed -> apply logic here 
    } 
} 
Verwandte Themen