2011-06-23 4 views
3

J'ai un très simplement UIViewController, et j'essaie de comprendre comment utiliser willRotateToInterfaceOrientation. mon UIViewController a une méthode viewDidLoad très simple:iOS willRotateToInterfaceOrientation utilisation correcte

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 48.0f)]; 
    theBar.tintColor = [UIColor orangeColor]; 

    UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"The Title"]; 
    item.hidesBackButton = YES; 
    [theBar pushNavigationItem:item animated:YES]; 
    [item release]; 

    [self.view addSubview:theBar]; 
} 

Donc, fondamentalement, j'ai juste un UINavigationBar au sommet de mon contrôleur. C'est tout. Je mis en œuvre des méthodes de rotation, en fonction de ce que je trouve en ligne:

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

-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration { 

    if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) { 
     theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 640, 48)]; 
    } 
} 

Alors, je lance l'application en mode portrait, et puis je torsion dans en mode paysage. Et fondamentalement, theBar reste toujours sa taille normale, et ne se redimensionne pas. Je suis sûr que c'est une question stupide, mais quelle est la bonne façon d'utiliser la capacité de rotation? Je veux faire en sorte que cela fonctionne aussi si l'application est lancée en mode paysage. Quelle est la meilleure façon d'initialiser mes composants quand le UIViewController est lancé, en gardant à l'esprit que je veux du support pour les deux orientations, et en gardant à l'esprit que je veux pouvoir changer la taille de tout en fonction des changements d'orientation de la vie du UIViewController? Merci!

+0

Avez-vous essayé des masques de redimensionnement automatique? – Pripyat

+0

qu'est-ce que c'est? peux-tu me montrer un exemple? – CodeGuy

Répondre

7

Ce que vous voulez faire est de changer le cadre de votre objet theBar existant, et ne pas instancier un nouveau. Vous pouvez le faire avec quelque chose comme ceci:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation 
             duration:(NSTimeInterval)duration { 
    CGRect f = CGRectMake(0, 
          0, 
          CGRectGetWidth(self.view.frame), 
          CGRectGetHeight(theBar.frame);  
    theBar.frame = f; 
} 

Notez que la valeur de self.view.frame est utilisée, qui contient valeurs post rotation. Notez également que la fonction que j'utilise ici est différente de la vôtre. Je ne l'ai pas testé avec la fonction que vous utilisez, donc je ne peux pas dire si ça va marcher ou pas. Enfin, vous pouvez éviter cela tout à fait en réglant simplement le autoresizingmask sur theBar à la place viewDidLoad:

[theBar setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin]; 
+0

C'est ce que je voulais dire :) Autosizing Masks sont incroyablement utiles! – Pripyat