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