2010-11-23 25 views
7

J'ai un UIWebview dans un UIScrollView. Dans le webview, j'ai un film YouTube intégré. Lorsque je joue sur le film YouTube, tout fonctionne correctement. Cependant, lorsque j'appuie sur le bouton plein écran, le film commence à être lu derrière la vue Web. Amener le WebView au premier plan ne fonctionne pas, car je veux que les fonctions de défilement de ScrollView fassent défiler horizontalement.SDK iPad: Le film YouTube intégré lit la version en plein écran derrière UIWebView

+0

Un UIWebView implémente son propre comportement de défilement.De plus, en fonction de la manière dont vous reliez les délégués, vous pourriez avoir un comportement bizarre avec 'UIScrollViewDelegate' implémenté par UIWebView et UIScrollView. Donc si vous dites à la fois le scrollview et le webview que sa propriété delegate devrait pointer sur vous (votre contrôleur), chaque fois que le webview défilera, il lancera des méthodes comme 'scrollViewDidScroll:' qui sera la même méthode que lorsque votre vue défile défile et pas la webview. Ça me semble méchant. – jer

+0

Ce que je veux réaliser, c'est que je peux faire défiler horizontalement différents webviews (où chaque webview est une page de magazine). Le comportement de défilement des webviews est désactivé. Alors, y a-t-il un moyen de faire mieux ou pouvez-vous me dire comment je peux mettre le film YouTube au premier plan? – user517153

Répondre

12

Fondamentalement, vous voulez être en mesure de détecter quand un film commence à jouer en plein écran et organiser vos vues de manière appropriée. Ensuite, lorsque la lecture en plein écran se termine, vous voulez pouvoir retrouver votre point de vue.

Le problème est qu'il n'existe aucun moyen documenté de se connecter ou de détecter quand un UIWebView déclenche la lecture vidéo en plein écran.

J'ai dit 'façon documentée', car il y a des notifications que vous pouvez utiliser pour détecter quand un UIWebView déclenche la lecture en plein écran. Vous pouvez simplement les écouter et réorganiser vos vues en conséquence. Cependant, je ne le recommande pas forcément, car ils sont non documentés et sujets à changement (en fait, ils ont une faute d'orthographe jusqu'à iOS 4.3, voir les réponses ci-dessous).

// For iOS 4.3 and above: 
UIMoviePlayerControllerDidEnterFullscreenNotification 
UIMoviePlayerControllerDidExitFullscreenNotification 

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

trouver ces out était un peu une douleur - il y a en fait plusieurs autres notifications qui se déclenchent quand une vidéo YouTube dans un UIWebView se reproduit. Pour les trouver, vous devez supprimer un point d'arrêt sur toutes les publications de notifications, puis inspecter manuellement les emplacements de mémoire de ces notifications pour déterminer leur nom de chaîne. En fait, je ne pense pas que quelqu'un les ait déjà retirés, parce que quand je les google je n'ai rien. Mais ils fonctionnent, promis! J'espère pouvoir être averti lorsque la lecture en plein écran est entrée/sortie sera utile, avec la mise en garde massive qu'Apple pourrait changer ce comportement non documenté à tout moment. Votre application ne sera pas carrément rejetée pour son utilisation (parce que vous n'appelez aucune méthode non documentée), et je l'ai utilisée dans les applications d'expédition. Mais ce n'est toujours pas la meilleure idée au monde ... peut-être la seule option que vous avez cependant. Editer: Pour clarifier, basé sur le commentaire ci-dessous: ce ne sont pas des constantes, donc vous auriez besoin de les mettre entre guillemets si vous étiez inscrit pour les notifications.

+0

Qu'est-ce que je dois # importer pour les faire travailler? J'utilise Xcode 4 et j'obtiens une erreur de construction (Utilisation de l'identificateur non déclaré) – ageektrapped

+2

Vous devez les mettre entre guillemets, ce ne sont pas des constantes, comme suit: 'addObserver: self selector: @selector (someSelector) name: @ Objet "UIMoviePlayerControllerDidEnterFullcreenNotification": nil] '- espérons que ça aide! – lxt

+1

Bernado a fait un bon accrochage dans 4.3 les noms de notification ont changé et sont maintenant épelés correctement. – lxt

2

Je voulais juste confirmer que cela fonctionne après avoir joué avec pendant un certain temps. Vous pouvez obtenir un accès direct à la vue dans laquelle la vidéo est en train de jouer. Il s'agit d'une méthode par blocs pour enregistrer la notification et extraire les vues pertinentes.

Remarque: Vous devrez retarder l'ajout de sous-vues et/ou accéder aux sous-vues internes d'Apple pour supprimer la barre de navigation et la personnaliser davantage.

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

Je n'ai pas de succès à faire fonctionner ça, le bloc ne se déclenche jamais, est-ce encore valide en 4.0? – box86rowh

+0

OK, semble qu'ils ont corrigé leur erreur d'orthographe, il est maintenant: UIMoviePlayerControllerDidEnterFullscreenNotification – box86rowh

+0

Puis-je mettre en pause la vidéo par programmation tandis que la lecture vidéo en plein écran dans uiwebview? – g212gs

6

Pour iOS 4.3 +, Apple a changé les noms de ces notifications: UIMoviePlayerControllerDidEnterFullcreenNotification est maintenant UIMoviePlayerControllerDidEnterFullscreenNotification

UIMoviePlayerControllerDidExitFullcreenNotification est maintenant UIMoviePlayerControllerDidExitFullscreenNotification

S'il vous plaît faites attention: Le terme "Fullscreen" a changé "Plein écran".

Merci! Pourquoi avez-vous un webview à l'intérieur d'un scrollview?

+0

Joliment repéré - J'ai mis à jour ma réponse pour faire référence à votre correction. – lxt