iOS: le titre de la barre de navigationL'affichage ne redimensionne pas correctement lorsque le téléphone tourne

Je suis en train d'écrire une application iPhone (comme la plupart des applications) prend en charge l'auto-rotation: Vous faites pivoter votre téléphone, et son point de vue de la faire pivoter et redimensionner de façon appropriée.

Mais je suis attribution d'un affichage personnalisé pour navigationItem.titleView (la zone de titre de la barre de navigation), et je n'arrive pas à redimensionner correctement lorsque le téléphone tourne.

Je sais ce que vous pensez, "Juste mis son autoresizingMask à UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight," mais il n'est pas simple. Bien sûr, si je n'ai pas mis mon point de vue est autoresizingMaskalors mon avis n'est pas redimensionnée; et je veux qu'il redimensionner.

Le problème est que si je ne ensemble de ses autoresizingMaskpuis il redimensionne correctement tant que l'affichage est visible; mais la titleView's taille se foiré dans ce scénario:

  1. Exécuter l'application, avec le téléphone en mode portrait. Tout semble bon.
  2. Faire quelque chose qui entraîne l'application de pousser un autre point de vue sur la pile de navigation. E. g. cliquez sur une ligne d'un tableau ou d'un bouton qui provoque un appel à [self.navigationController pushViewController:someOtherViewController animated:YES].
  3. Lors de l'affichage du contrôleur enfant, faites pivoter le téléphone en mode paysage.
  4. Cliquez sur le bouton "Retour" pour revenir à l'affichage de niveau supérieur. À ce stade, le titre de la vue est foiré: Bien que vous tenez le téléphone en mode paysage, le titre est encore de taille moyenne comme si vous le teniez en mode portrait.
  5. Enfin, faites pivoter le téléphone en mode portrait. Maintenant, les choses vont de mal en pire: Le titre de la vue se rétrécit en taille (depuis la barre de navigation est plus petit), mais comme il était déjà trop petit, maintenant il est beaucoup trop petit.

Si vous souhaitez reproduire ce vous-même, suivez ces étapes (c'est un peu de travail):

  1. Faire une application en utilisant Xcode "Navigation-based Application" assistant.
  2. Le configurer de sorte que le haut-niveau de la table de la vue a des lignes qui, lorsque vous cliquez sur eux, pousser une vue de détail sur la pile de navigation.
  3. Inclure ce code dans le haut-niveau-vue-contrôleur et la vue de détail de contrôleur:
    - (BOOL)shouldAutorotateToInterfaceOrientation:
            (UIInterfaceOrientation)interfaceOrientation {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }
  4. Inclure ce code dans seulement le niveau supérieur-vue-contrôleur:
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        //Create "Back" button
        UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Master"
            style:UIBarButtonItemStylePlain target:nil action:nil];
        self.navigationItem.backBarButtonItem = backButton;
        [backButton release];
    
        //Create title view
        UILabel* titleView = [[[UILabel alloc] initWithFrame:CGRectMake(0,0,500,38)] autorelease];
        titleView.textAlignment = UITextAlignmentCenter;
        titleView.text = @"Watch this title view";
    
        //If I leave the following line turned on, then resizing of the title view
        //messes up if I:
        //
        //1. Start at the master view (which uses this title view) in portrait
        //2. Navigate to the detail view
        //3. Rotate the phone to landscape
        //4. Navigate back to the master view
        //5. Rotate the phone back to portrait
        //
        //On the other hand, if I remove the following line, then I get a different
        //problem: The title view doesn't resize as I want it to when I:
        //
        //1. Start at the master view (which uses this title view) in portrait
        //2. Rotate the phone to landscape
        titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    
        self.navigationItem.titleView = titleView;
    }
  5. Enfin, suivez mes étapes de reproduction.

Alors ... suis-je en train de faire quelque chose de mal? Est-il un moyen de faire de mon titleView toujours redimensionner correctement?

source d'informationauteur Mike Morearty