2010-09-20 4 views
2

Lorsque l'application est en mode paysage (que je prévois forcer), l'affichage d'une vue modale entraîne la rotation de la vue parent en mode portrait. Si je place la valeur de retour de shouldAutoRotateToInterfaceOrientation sur NO, le parent ne tourne pas, mais le modal glisse alors du côté et affiche latéralement. Voici le code qui révèle le modal.iPad Modal View pivote parentViewController View

- (IBAction)loadExistingGame:(id)sender { 

SavedGamesTableViewController *savedGames = [[SavedGamesTableViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
savedGames.modalPresentationStyle = UIModalPresentationFormSheet; 
[self presentModalViewController:savedGames animated:YES]; 

[savedGames release]; 

}

Comme par demande est ici le contenu de la méthode shouldAutoRotate du SavedGamesTableViewController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Override to allow orientations other than the default portrait orientation. 
return YES; 

}

+0

S'il vous plaît montrer la mise en œuvre de 'shouldAutoRotateToInterfaceOrientation' intérieur SavedGamesTableViewController. –

+0

Ajout de la méthode, mais il s'agit simplement du code généré par la plaque de la chaudière. – Kyle

Répondre

2

Ok, j'ai compris ce qui devait être fait pour le réparer. Le fichier plist qui contient une liste des orientations possibles doit être limité à une vue paysage unique. Le parent de la vue table modale doit avoir la méthode shouldAutoRotateToInterfaceOrientation renvoyer YES uniquement si l'orientation correspond à la seule orientation dans le fichier plist.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Overriden to allow any orientation. 
return interfaceOrientation = UIInterfaceOrientationLandscapeRight; 

}

le viewcontroller modal doit retourner NO pour la même méthode.

0

Basé sur

Lorsque l'application est dans les terres cape mode (que je prévois de forcer), l'affichage d'une vue modale provoque la rotation de la vue parent au mode portrait .

et

Comme par demande est ici le contenu de la méthode shouldAutoRotate du SavedGamesTableViewController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Override to allow orientations other than the default portrait orientation. 
return YES; 
} 

Alors ce que vous dites est que le contrôleur de vue parent n'est pas encore configuré pour forcer uniquement l'orientation paysage, et lorsque vous affichez une vue modale définie pour autoriser toutes les orientations, vous êtes Pourquoi la vue parent pivote-t-elle en mode portrait lorsque vous faites pivoter l'appareil en mode portrait? Je ne comprends pas votre question ... ne dites-vous pas que le contrôleur de vue parents est actuellement configuré pour permettre la rotation en portrait? Ce comportement n'est-il pas exactement ce qui devrait arriver?

+0

Non, le périphérique n'est pas pivoté. Lorsqu'une vue modale est affichée, le parent du modal pivote. – Kyle

+0

En plus du 'SavedGamesTableViewController', existe-t-il un autre contrôleur affiché à l'écran? Les documents indiquent que tous les contrôleurs à l'écran doivent se mettre d'accord sur une autorotation pour que cela se produise; Si un seul de vos contrôleurs de vue à l'écran dans cette boîte de dialogue modale est configuré pour utiliser uniquement le mode portrait, il ne s'affichera que dans le mode portrait. –

+0

Le seul autre contrôleur sur l'écran est le contrôleur tableview contenu dans le modal. Il a le même code standard pour la méthode shouldautorotate .... – Kyle

0

J'ai rencontré un problème similaire lors de l'affichage d'une vue de courrier modal. Forcer la rotation n'a pas fonctionné pour moi, mais l'appel de presentModalViewController sur le contrôleur de la vue principale de l'application plutôt que sur un contrôleur de vue enfant a résolu le problème.

+0

N'a pas fait l'affaire. J'utilise même window.rootViewController, mais toujours pas de changement. – stigi

0

Je voyais le même comportement; Dans mon cas, le problème était que j'avais implémenté shouldAutorotateToInterfaceOrientation pour retourner YES inconditionnellement pour le contrôleur de vue parent mais PAS pour le contrôleur de vue modale présenté. Je pense donc que le commentaire de Shaggy Frog est la clé: que vous vouliez forcer le mode paysage ou pas, vous devez vous assurer que les implémentations de shouldAutorotateToInterfaceOrientation des deux contrôleurs de vue sont d'accord ou qu'une bizarrerie s'ensuivra.

0
UIViewController *vc = /* create view controller */; 
UINavigationController *nc = nil; 
if (IOS_VERSION_LESS_THAN_6_0) { 
    nc = [[MyCustomNavigationControllerSupportingAllOrientations alloc] initWithRootViewController:vc]; 
} else { 
    nc = [[UINavigationController alloc] initWithRootViewController:vc]; 
} 
[self.navigationController presentModalViewController:nc animated:YES]; 

Sur iOS6, j'utilise un UINavigationController.

Sur pré-iOS6 I sous-classe UINavigationController, comme ceci:

@interface MyCustomNavigationControllerSupportingAllOrientations : UINavigationController 
@end 

@implementation MyCustomNavigationControllerSupportingAllOrientations 
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 
@end