2009-05-07 5 views
4

Mon application lance en mode paysage correctement et fonctionne très bien:Iphone commutation en mode paysage en mode Portraite sur le chargement nouveau contrôleur

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if(interfaceOrientation == UIInterfaceOrientationPortrait) 
     return NO; 
    if(interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
     return YES; 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

Et Info.plist mis à jour avec

UIInterfaceOrientation = UIInterfaceOrientationLandscapeRight 

Maintenant, dans mon contrôleur principal Je déconnecte un ViewController pour un autre

characterController = [ [ CharacterController alloc ] init]; 
myCurrentViewController = characterController; 
self.view = myCurrentViewController.view ; 

et il charge mais l'orien L'image est en mode Portrait. Si j'ai ensuite fait pivoter l'iPhone, il le corrige en mode paysage. Des idées pour garder l'orientation paysage lors du chargement d'un nouveau viewController dans mon contrôleur principal?

Répondre

1

Je pense que vous devez mettre en œuvre

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

dans votre CharacterController ainsi.

+0

Il est mis en œuvre la question ne correspondait pas à cela. J'ai mis à jour la question –

-2

Encore une fois, j'ai trouvé ma propre réponse. LOL

Après le chargement de la nouvelle ViewController

self.view = myCurrentViewController.view; 

contrôleur de mise à jour pour orienter la nouvelle ViewController au paysage

self.view.transform = CGAffineTransformMakeRotation(-3.14 * (90)/180.0); 
self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f); 
self.view.center = CGPointMake(160.0f, 240.0f); 
1

a trouvé une autre solution:

[myCurrentViewController presentModalViewController: newController animated: NO]; 
7

Soyez très prudent au sujet de votre self.view=otherVC.view approches. Un UIViewController est destiné à gérer une vue unique. Il n'est pas conçu pour que sa vue soit échangée (c'est pourquoi vos changements d'orientation ne fonctionnent pas). Cela compte dans des cas comme -didReceiveMemoryWarning si votre ViewController n'est pas à l'écran. Il va vider tranquillement sa vue, et quand il revient à l'écran, rechargez la vue à partir de la NIB (ou relancez -loadView).

Votre approche presentModalViewController: est un peu meilleure, bien que ce ne soit pas la manière dont une vue modale est conçue pour fonctionner. Au moins, chaque ViewController gère sa propre vue. Typiquement, vous utiliseriez un UITabBarController ou un UINavigationController ici. Je suppose que vous avez une raison pour laquelle vous évitez ceux-ci.

Ma solution recommandée serait d'ajouter un UIView à la vue du contrôleur de votre vue principale (en tant qu'IBOutlet ou en code). Vous échangez cette vue plutôt que d'inverser la vue de UIViewController. Je vais probablement aller de l'avant et sous-classe UIViewController pour gérer cela, avec des méthodes modélisées après UITabBarController.

@interface RNSwappableViewController : UIViewController 
{ 
    ... 
} 
@property(nonatomic, assign) id<RNSwappableViewControllerDelegate> delegate; 
@property(nonatomic) NSUInteger selectedIndex; 
@property(nonatomic, assign) UIViewController *selectedViewController 
@property(nonatomic, copy) NSArray *viewControllers; 
@end 

@protocol RNSwappableViewControllerDelegate : NSObject 
- (void)swappableViewController:(RNSwappableViewController *)swappableViewController didSelectViewController:(UIViewController *)viewController 
@end 
+0

Oui, après avoir résolu mon problème et lu encore plus, j'ai découvert que UINavigationController aurait dû être utilisé. –

0

Avez-vous eu le problème où shouldAutorotateToInterfaceOrientation se est appelé avec UIInterfaceOrientationPortrait débutant même lorsque le téléphone était le paysage?

J'ai une application qui est principalement portrait seul et avec un contrôleur de vue que je présente avec presentModalViewController que je veux faire de l'autorotate, que j'ai bien travaillé, mais quand je l'ouvrais, il commencerait toujours en portrait. Le contrôleur de vue a semblé préférer l'orientation du contrôleur de vue parent sur celle du périphérique.

C'est ce qui a fonctionné pour moi, dans le contrôleur de vue de vue modal:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; 

// if device orientation is one of these, don't care what our interface orientation is 
if (deviceOrientation == UIDeviceOrientationUnknown && deviceOrientation == UIDeviceOrientationFaceUp && deviceOrientation == UIDeviceOrientationFaceDown) 
    return YES; 

// otherwise only return YES for the ui orientation matching the current device orientation 
return (interfaceOrientation == deviceOrientation); 
} 
0

j'avais exactement le même problème, sauf que j'ajoutais le modal à un UITableViewController. J'ai découvert que c'était seulement un problème s'il était appelé depuis viewDidLoad, car le modal était présenté avant que les orientations ne soient confirmées par le délégué du contrôleur de vues.

Donc je viens d'utiliser un appel performSelector avec un timer, appelé depuis viewDidLoad. Maintenant, il charge dans la bonne orientation.

3

J'ai utilisé le code recommandé. La table tourne, en fait. Cependant, la barre de titre est toujours dans l'orientation et la position portrait normales. Comment puis-je repositionner la barre de titre?

// personnalisés apparaissent qui tourne le tableview

- (void)viewDidAppear:(BOOL)animated 
{ 
    self.view.transform = CGAffineTransformMakeRotation(-3.14 * (90)/180.0); 
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f); 
    self.view.center = CGPointMake(160.0f, 240.0f); 

} 
+0

Utilisez plutôt CGAffineTransformMakeRotation (M_PI_2) ou ajoutez des décimales à 3.14. Sinon, la rotation sera de 0,05 degrés et certains éléments pourraient être irréguliers lors du rendu. – Sten

Questions connexes