2010-11-23 12 views
7

Ich habe eine UIWebview in einem UIScrollView. In der Webansicht habe ich einen eingebetteten YouTube-Film. Wenn ich den YouTube-Film spiele, funktioniert alles einwandfrei. Wenn ich jedoch die Vollbild-Taste drücke, wird der Film hinter dem Webview abgespielt. Das WebView in den Vordergrund zu bringen, funktioniert nicht, weil ich die Scroll-Funktionen des ScrollViews horizontal scrollen lassen möchte.iPad SDK: Embedded YouTube Film spielt Vollbild-Version hinter UIWebView

+0

Warum haben Sie eine Webansicht in einem Scrollview? Ein UIWebView implementiert sein eigenes Scroll-Verhalten.Je nachdem, wie Sie die Delegierten verbinden, können Sie außerdem merkwürdiges Verhalten in Bezug auf das UIScrollViewDelegate erhalten, das sowohl von UIWebView als auch von UIScrollView implementiert wird. Wenn Sie also sowohl dem scrollview als auch dem webview mitteilen, dass seine delegate -Eigenschaft auf sich selbst (Ihren Controller) zeigen soll, wird jedes Mal, wenn das Webview scrollt, Methoden wie 'scrollViewDidScroll:' ausgelöst, was dieselbe Methode ist, die wann ausgelöst wird Ihre Bildlaufansicht scrollt und nicht die Webansicht. Scheint böse zu mir. – jer

+0

Was ich erreichen möchte, ist, dass ich horizontal durch verschiedene Webansichten blättern kann (wobei jedes Webview eine Magazinseite ist). Das Scrollverhalten der Webviews ist deaktiviert. Gibt es eine Möglichkeit, dies besser zu machen, oder kannst du mir sagen, wie ich den YouTube-Film in den Vordergrund rücken kann? – user517153

Antwort

12

Grundsätzlich möchten Sie erkennen können, wenn ein Film beginnt, Vollbildmodus zu spielen und Ihre Ansichten entsprechend anzuordnen. Dann, wenn die Vollbildwiedergabe beendet ist, möchten Sie Ihre Ansichten wieder auf ihre ursprüngliche Position bringen können.

Das Problem ist, es gibt keine dokumentierte Möglichkeit, sich einzuklinken oder zu erkennen, wenn ein UIWebView die Videowiedergabe im Vollbildmodus auslöst.

Ich sagte "dokumentierte Weise", weil es einige Benachrichtigungen gibt, mit denen Sie erkennen können, wenn ein UIWebView die Vollbildwiedergabe auslöst. Sie können nur auf sie hören und Ihre Ansichten entsprechend neu anordnen. Ich empfehle das jedoch nicht unbedingt, da sie undokumentiert sind und sich ändern können (tatsächlich haben sie einen Schreibfehler bis iOS 4.3, siehe Antworten unten).

// For iOS 4.3 and above: 
UIMoviePlayerControllerDidEnterFullscreenNotification 
UIMoviePlayerControllerDidExitFullscreenNotification 

// For iOS 4.2 and below: 
UIMoviePlayerControllerDidEnterFullcreenNotification 
UIMoviePlayerControllerDidExitFullcreenNotification // (note spelling mistake) 

diese heraus zu finden, war ein bisschen wie ein Schmerz - es gibt tatsächlich einige mehr Benachrichtigungen sind, die ausgelöst werden, wenn ein YouTube-Video in einem UIWebView wiedergegeben wird. Um sie herauszufinden, müssen Sie bei allen Benachrichtigungen einen Haltepunkt löschen und dann manuell die Speicherorte dieser Benachrichtigungen überprüfen, um ihre String-Namen herauszufinden. Ich glaube nicht, dass irgendjemand diese zuvor herausgezogen hat, denn wenn ich sie google, bekomme ich nichts. Aber sie funktionieren, versprochen!

Ich hoffe, in der Lage zu sein, benachrichtigt zu werden, wenn die Vollbildwiedergabe eingegeben/beendet wird, mit der massiven Einschränkung, dass Apple dieses undokumentierte Verhalten jederzeit ändern könnte. Ihre App wird nicht sofort abgelehnt, um sie zu verwenden (weil Sie keine undokumentierten Methoden aufrufen), und ich habe sie in Versandanwendungen verwendet. Aber es ist immer noch nicht die beste Idee der Welt ... vielleicht die einzige Option, die Sie haben.

Bearbeiten: Um zu klären, basierend auf dem Kommentar unten: Sie sind keine Konstanten, also müssten Sie sie in Anführungszeichen setzen, wenn Sie für Benachrichtigungen registriert waren.

+0

Was muss ich importieren, um sie zur Arbeit zu bringen? Ich verwende Xcode 4 und ich bekomme einen Build-Fehler (Verwendung von nicht deklarierten Bezeichner) – ageektrapped

+2

Sie müssen sie in Anführungszeichen setzen, sie sind keine Konstanten, wie folgt: 'addObserver: self selector: @selector (someSelector) name: @ "UIMoviePlayerControllerDidEnterFullcreenNotification" Objekt: nil] '- hoffe das hilft! – lxt

+1

Bernado hat einen guten Fang gemacht - in 4.3 haben sich die Benachrichtigungsnamen geändert und sind jetzt richtig geschrieben. – lxt

2

Ich wollte nur bestätigen, dass das funktioniert, nachdem ich eine Weile damit herumgespielt habe. Sie können direkten Zugriff auf die Ansicht erhalten, in der das Video abgespielt wird. Dies ist eine Blockierungsmethode, mit der Sie sich für die Benachrichtigung registrieren und relevante Ansichten abrufen können.

Hinweis: Sie müssen das Hinzufügen von Unteransichten verzögern und/oder auf interne Unteransichten von Apple zugreifen, um die Navigationsleiste zur weiteren Anpassung zu entfernen.

[[NSNotificationCenter defaultCenter] 
    addObserverForName:@"UIMoviePlayerControllerDidEnterFullcreenNotification" 
    object:nil 
    queue:nil 
    usingBlock:^(NSNotification *note){ 
      MPMoviePlayerController *theMovieController = [note object]; 
      UIView *theDestinationVideoView = [[note userInfo] 
      objectForKey:@"UIMoviePlayerControllerFullscreenViewUserInfoKey"]; 
}]; 
+0

Ich habe keinen Erfolg damit das funktioniert, der Block wird nie ausgelöst, ist das noch in 4.0 gültig? – box86rowh

+0

OK, scheint, dass sie ihre Rechtschreibfehler behoben haben, ist es jetzt: UIMoviePlayerControllerDidEnterFullscreenNotification – box86rowh

+0

Kann ich das Video programmgesteuert anhalten, während das Video im Vollbildmodus in uiwebview abgespielt wird? – g212gs

6

Für iOS 4.3+, haben Apple-die Namen dieser Meldungen geändert: UIMoviePlayerControllerDidEnterFullcreenNotification ist jetzt UIMoviePlayerControllerDidEnterFullscreenNotification

UIMoviePlayerControllerDidExitFullcreenNotification jetzt ist UIMoviePlayerControllerDidExitFullscreenNotification

Bitte beachten: Der Begriff "Fullscreen" hat sich geändert "Vollbild".

Danke!

+0

Schön entdeckt - ich habe meine Antwort aktualisiert, um Ihre Korrektur zu referenzieren. – lxt

Verwandte Themen