Question

Je peux voir que c'est quelque chose qui a été troublant beaucoup de gens: /

J'ai un UITabBarController qui a 4 viewControllers, tous de type UINavigationController. L'un des navigationControllers obtient un viewController poussé sur sa pile, ce viewController doit être présenté en mode paysage / orientation.

Le viewController est un graphique, il est l'endroit tout à fait que dans l'application où le paysage est logique. (Je cache le UITabBar lorsque cela est présenté pour ne pas conduire l'utilisateur à croire que cela fonctionne partout)

Pour faire répondre de UITabBarController correctement aux changements d'orientation tous ses viewControllers doivent retourner la même valeur de la méthode déléguée:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Donc, pour accueillir ce comportement, je l'ai mis en œuvre cette méthode dans tous les viewControllers appartenant au UITabBarController:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL canRotate = [defaults boolForKey:@"can_rotate"];

    return canRotate;
}

Le « truc » est maintenant que quand mon viewController peut-être-paysage est poussé que je fais ceci:

- (void) viewWillAppear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:YES forKey:@"can_rotate"];
    [defaults synchronize];

}

et quand il est sauté, je fais ceci:

- (void) viewWillDisappear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"can_rotate"];
    [defaults synchronize];

}

Cela fonctionne vraiment bien. Lorsque le viewController est sur la pile I peut faire tourner le dispositif et la vue suivante.

Le problème est cependant que si l'utilisateur tape sur le bouton « retour » sur le navigationBar en mode paysage, popping ainsi le viewController au viewController précédent, ce « vieux » viewController est bien sûr aussi en mode paysage. Pour empirer les choses, parce que je mets le BOOL NO, ce « vieux » viewController ne peut pas tourner quand j'Orienter l'appareil en mode portrait.

Est-il possible de mettre à jour tout pour qu'aucun de mes autres viewControllers sera en mode paysage quand je pop la boîte-être en mode paysage viewController?

Je suis un peu inquiet que si cela pourrait se faire du paysage au portrait, il devrait également être possible du mode portrait au paysage, rendant ainsi mon inutile « pirater » .. mais si elle ne peut pas, alors je suis de retour à la case départ : /

Hope Je suis proche et que quelqu'un pourrait me aider à y arriver, merci:)

Était-ce utile?

La solution

Je pense que je peux simplifier la chose ....

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return NO;
}

-(void) viewDidAppear:(BOOL)animated { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(90.0*0.0174532925);
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
    self.view.center = CGPointMake(160.0f, 240.0f);

// [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;

[UIView commitAnimations];
[super viewDidAppear:animated];

}

Rien ne tourne auto, mais vous ensuite tourner manuellement la vue que vous souhaitez déplacer. Si vous ne avez besoin d'aide du clavier dans la vue que vous n'avez pas besoin de changer le statusBarOrientation.

Si vous ne voulez toujours ce point de vue tourné alors vous avez un problème un peu plus difficile - vous pourriez vouloir vérifier les valeurs de l'accéléromètre pour déterminer dans quel sens le téléphone est (ou il pourrait être possible de laisser entendre quelle manière le téléphone a été transformé par des appels à shouldAutotateToInterfaceOrientation puis il suffit d'appeler le code transformer comme et quand vous en avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top