iOS7 / iOS6 Conditionnelle de Rotation Portrait / Paysage pour les différentes sections de l'Application

Problème: Un disposez d'une Application qui utilise à la fois en mode Paysage (verrouillé) et le Mode Portrait (verrouillé) pour les différentes parties de l'application. Maintenant, j'ai une solution qui fonctionne mais il ne semble pas correcte et ne dispose pas de ses propres problèmes.

De façon optimale j'aimerais forcer un changement d'orientation. La pensée même de faire une vue de la transformation si nécessaire.

Débit de base de l'Application:

  • HomeView (Portrait) (qui a un peu de sous poussé des vues qui sont aussi le portrait et verrouillé).
  • LandscapeView (Paysage) (qui a 5 a poussé les sous-vues qui sont aussi paysage)

Remarque:

  • HomeView a un lien vers LandscapeView
  • LandscapeView pouvez revenir à HomeView
  • À la fin de la LandscapeView des sous-vues, il retourne à la HomeView

De base de l'Image montrant la façon dont cela ressemble à de la point de vue différent orientations. (Les lignes indiquent le flux de l'application, l'orientation des images indiquer pour chaque écran doit être )

iOS7 /iOS6 Conditionnelle de Rotation Portrait /Paysage pour les différentes sections de l'Application

Actuellement ci-dessous à l'aide de la mise en œuvre de l'appel /définir si l'affichage est en mode portrait ou en mode paysage par [setLockedToPortait:OUI] (mode portrait), etc.

Ce soit en terme rend la requête pour l'interface d'orientation à utiliser à partir de iOS si l'appareil est en rotation.

Maintenant pour le cas d'aller à la LandscapeView, je montre temporaire de la vue sur le haut de l'affichage normal de demander à utiliser pour faire tourner leur téléphone en mode paysage. (Une situation temporaire est également illustré lors du retour à la HomeView d'un paysage)

Donc, une fois que l'utilisateur a tourné à leur appareil, il va déclencher la bonne orientation et de la temporaire de la vue se cacher.

Si l'utilisateur tourne alors à leur téléphone portrait à ce stade, il sera toujours verrouillée en mode paysage afin de ne pas déclencher une autre rotation de la vue (aussi pas de temp vue apparaîtra ou quoi que ce soit)


Actuel De La Mise En Œuvre De Code::

//---------------------- NavigationController (subclass of UINavigationController)
@interface NavigationController () {
BOOL isOrientationPortrait;
}
@end
@implementation NavigationController {
UIDeviceOrientation lastAccepted;
UIDeviceOrientation lastKnown;
}
-(void)setLockedToPortait:(BOOL)isLocked {
isOrientationPortrait = isLocked;
}
-(UIDeviceOrientation) getCurrentOrientation {
UIDeviceOrientation orientate = [[UIDevice currentDevice] orientation];
if(orientate == 0) { //needed for simulator
orientate = (UIDeviceOrientation)[UIApplication sharedApplication].statusBarOrientation;
}
return orientate;
}
//Deprecated in iOS6, still needed for iOS5 support.
- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)toInterfaceOrientation
{
UIDeviceOrientation orientation = [self getCurrentOrientation];
[self setLastKnownOrientation:orientation];
if(isOrientationPortrait == YES) {
if([self isLastKnownPortrait] == YES) {
[self setLastAcceptedOrientation:orientation];
return YES;
} else {
return NO;
}
} else {
if([self isLastKnownLandscape] == YES) {
[self setLastAcceptedOrientation:orientation];
return YES;
} else {
return NO;
}
}
}
//iOS6/7 support
- (BOOL)shouldAutorotate
{
//find out the current device orientation
UIDeviceOrientation orientation = [self getCurrentOrientation];
[self setLastKnownOrientation:orientation];
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
if(isOrientationPortrait == YES) {
if([self isLastKnownPortrait] == YES)
{
UIDeviceOrientation orientation = [self getCurrentOrientation];
[self setLastAcceptedOrientation:orientation];
}
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
} else {
if([self isLastKnownLandscape] == YES)
{
UIDeviceOrientation orientation = [self getCurrentOrientation];
[self setLastAcceptedOrientation:orientation];
}
return (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight );
}
}
-(void)setLastAcceptedOrientation:(UIDeviceOrientation)orient  {
lastAccepted = orient;
}
-(void)setLastKnownOrientation:(UIDeviceOrientation)orient {
lastKnown = orient;
}
-(BOOL)isLastKnownPortrait {
return UIDeviceOrientationIsPortrait(lastKnown);
}
-(BOOL)isLastKnownLandscape {
return UIDeviceOrientationIsLandscape(lastKnown);
}
-(BOOL)isLastAcceptedPortrait {
return UIDeviceOrientationIsPortrait(lastAccepted);
}
-(BOOL)isLastAcceptedLandscape {
return UIDeviceOrientationIsLandscape(lastAccepted);
}

Problèmes Actuels:

  • Appareil rotations sont toujours requis après une vue a chargé pour l'utilisateur passe en mode Paysage à Portrait et vice versa.
  • Si l'utilisateur a l'orientation de l'écran verrouillé, cela ne fonctionnera pas du tout.
  • Lors de la transition du mode Paysage, et que l'utilisateur a déjà tourné leur appareil en mode Portrait (en mode paysage), le Portrait de la vue de l'interface va être verrouillé à un "Paysage" mise en page jusqu'à l'utilisateur de re-tourne leur appareil (donc, actuellement, je suis juste montrant la superposition de faire pivoter l'appareil, mais il est déjà tourné... très gênant pour l'utilisateur). Énorme problème en ce moment avec le ci-dessus la mise en œuvre.

Aimerais être capable de:

  • Force un changement d'orientation sur le téléphone pour l'affichage en cours.
  • Définir une mise en page plus pratique d'un point de vue qui est forcée entre push/pop de vues.

J'ai regardé d'un lot à l'autre des solutions ici et sur le Dev Apple forums, mais aucun n'semblent couvrir ce problème, ou encore cette orientation bug entre les deux points de vue qui existe.

Merci pour toute aide ou des pointeurs! Aucun avis sera actualisée 😀

--
Edit::

Solution Trouvée grâce à @leo-natan!!

Ainsi, au lieu d'essayer de forcer un changement d'orientation sur les points de vue. Il suffit de pousser un nouveau modal vue. Cette évolution oblige. Vous devez toujours au-dessus de code d'orientation pour la gestion des rotations.

Donc ce que j'ai maintenant dans mon HomeViewController:

LandscapeViewController * viewController = [[[LandscapeViewController ViewController alloc] init] autorelease];
UINib * nib = [UINib nibWithNibName:@"NavigationController" bundle:nil];
NavigationController *navController = [[nib instantiateWithOwner:nil options:nil] objectAtIndex:0];
[navController initWithRootViewController:viewController];
[self presentViewController:navController animated:YES completion:^{
//completion
}];

De sorte qu'il est nécessaire de ré-ajouter une nouvelle manette de navigation pour cette modal vue. Aussi la remarque ci-dessus 'presentViewController' est la nouvelle façon de pousser Modal vues.

Mis en œuvre cette méthode surchargée pour la gestion de la vue-contrôleur:

-(id)initWithRootViewController:(UIViewController *)rootViewController {
self = [super initWithRootViewController:rootViewController];
if(self){
}
return self;
}

Remarque: ci-dessus n'est pas à l'aide de story-boards. Le problème peut être résolu en utilisant des story-boards et modal montrant une vue de la même manière.

OriginalL'auteur Danoli3 | 2013-09-27