Rotation de la lecture en plein écran MPMoviewPlayerController avec UIViewController sous-jacent avec mode portrait uniquement (rotation interdite)
Bonjour,
J'ai une application simple, qui ne contiennent UITabBarController avec deux UIViewControllers. Les deux UIViewControllers portrait uniquement (pas de rotation autorisé). Un UIViewController de UIView ne contiennent MPMoviePlayerController de vue de permettre la lecture de la vidéo à l'intérieur de ce point de vue avec la possibilité de le faire en plein écran via le contrôle (MPMovieControlStyleEmbedded). Le code est simple et ne ressembler à ...
__moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"MOVIE_URL"]];
__moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
__moviePlayer.view.frame = CGRectMake( 10, 10, 300, 200 );
__moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
__moviePlayer.shouldAutoplay = NO;
[__moviePlayer prepareToPlay];
[self.view addSubview:__moviePlayer.view];
... ceci fonctionne parfaitement, sauf si l'utilisateur change de plein écran de lecture où je veux pour permettre la rotation pour permettre le paysage de la lecture aussi. La Rotation ne fonctionne pas, parce que UITabBarController ne l'autorise pas (et les deux UIViewControllers trop).
Donc, j'ai essayé les deux approches, mais aucun d'entre eux ne fonctionne pas comme prévu.
1) Sous-Classé UITabBarController
J'ai fait ajouter une propriété BOOL __allowRotation et si elle est définie sur OUI, je suis de retour OUI dans UITabBarController de shouldAutorotateToInterfaceOrientation méthode.
Je suis à l'écoute pour MPMoviePlayerDidEnterFullscreenNotification et MPMoviePlayerWillExitFullscreenNotification notifications pour définir cette propriété à la fois OUI et NON.
Il fonctionne, mais le problème, c'est que lorsque l'utilisateur termine la lecture vidéo en mode paysage, la vision sous-jacente n'est pas tourné le dos à portrait. La seule façon de tourner le dos à portrait de l'utilisation privée de l'API, qui n'en est pas.
2) de la Vue ou de la couche de transformation
J'ai aussi fait d'essayer d'écouter pour MPMoviePlayerDidEnterFullscreenNotification et MPMoviePlayerWillExitFullscreenNotification notifications.
Lorsque je reçois MPMoviePlayerDidEnterFullscreenNotification, je commence UIDevice orientation des notifications pour obtenir de l'orientation de l'écran. Je suis en train de transformer MPMoviePlayerController de la couche de la vue actuelle de l'orientation de l'écran, mais c'est un peu le système immunitaire, car elle ne fait rien. Je peux assigner ce à transformer des biens, mais il ne fait rien.
Elle n'est pas tout à fait correcte. Quand j'applique la transformation au cours de la rotation, je peux voir l'effet de cette transformation quand je passe du plein écran de la vidéo intégrée de la lecture.
3) Séparer UIWindow
Je n'ai pas tester encore, mais j'ai trouvé quelque part que MPMoviePlayerController crée séparé UIWindow pour un affichage plein écran de lecture, qui doit être accessible via [[UIApplication sharedApplication] windows]. Cela explique pourquoi la transformation n'est pas appliquée lors de la lecture en plein écran.
Mais je n'aime pas cette solution, car le UIWindow ne peuvent pas être identifiées et je ne veux pas utiliser les constantes magiques comme objectAtIndex:1 ou appliquer la transformation à tous les UIWindows à l'exception de la principale, etc.
À côté du fait que l'implémentation sous-jacente peut être modifié, et il cessera de fonctionner.
Question
Donc la question est, comment permettre à MPMoviePlayerController plein écran uniquement la lecture de rotation lorsque le sous-jacent UIView (ie. UIView de UIViewController) interdit la rotation et permet portrait?
source d'informationauteur robertvojta
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer de présenter de nouvelles UIViewController (avec shouldAutorotate OUI) modal et ajoutez __moviePlayer.vue dans ce contrôleur, lorsqu'il envoie des MPMoviePlayerWillEnterFullscreennotification. Faire le contraire quand moviePlayer sorties en plein écran.
J'ai une situation très semblable. Mon application est en mode portrait uniquement. Mais j'ai besoin d'afficher en plein écran des vidéos dans tous les sens, et puis revenir à l'orientation portrait, une fois que l'utilisateur quitte le mode plein écran.
Split méthode ne fonctionne pas pour moi, parce que je tiens à permettre à l'utilisateur de regarder la vidéo en plein écran et intégré, et de basculer entre les modes, de ne pas perdre la position de lecture, et sans aucune pause.
J'ai trouvé cette solution de contournement:
Tout d'abord, j'ai une racine UINavigationController sous-classe, qui reçoit tous les messages concernant la rotation.
J'interdire la rotation dans le contrôleur avec:
Je suis substitution de la
Ajout du support pour l'orientation des modifications:
Maintenant, j'ai un gestionnaire receivedRotate: - qui attrape tous les périphériques de rotations, en dépit de ne pas auto-rotation pour toutes les orientations à l'exception de portrait:
Je viens de vérifier les rotations de l'appareil, et de faire tourner mon point de vue en conséquence.
Alors - comment la racine contrôleur sait, lorsque la vidéo est en plein écran?
Juste ajouter deux autres gestionnaires de messages à l'init:
Et les gestionnaires eux-mêmes:
Lors d'une sortie en plein écran - nous restaurer l'orientation portrait.
Donc, cela fonctionne pour moi, j'espère que ça aidera quelqu'un.
Inscrire pour MPMoviePlayerWillExitFullscreenNotification et MPMoviePlayerWillEnterFullscreennotification dans délégué d'application et de gérer l'orientation à l'aide d'une variable d'instance.
La MPMoviePlayerViewController a sa propre fonction de présenter des vidéos modal:
Salut à tous, j'ai eu même problème que j'ai résolu -
Voici mon code complet....
Vous devez d'abord en appdelegate:
Registre des Notifications pour le plein écran de contrôle:
Ensuite, ajoutez la ligne de code dans le lecteur de contrôleur:
Ce code est testé dans iOS6 et iOS7 fonctionne bien. Grâce
S'il vous plaît laissez-moi savoir si il y a une question.....