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 autoresizingMask
alors mon avis n'est pas redimensionnée; et je veux qu'il redimensionner.
Le problème est que si je ne ensemble de ses autoresizingMask
puis il redimensionne correctement tant que l'affichage est visible; mais la titleView
's taille se foiré dans ce scénario:
- Exécuter l'application, avec le téléphone en mode portrait. Tout semble bon.
- 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]
. - Lors de l'affichage du contrôleur enfant, faites pivoter le téléphone en mode paysage.
- 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.
- 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):
- Faire une application en utilisant Xcode "Navigation-based Application" assistant.
- 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.
- 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); }
- 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; }
- 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
Vous devez vous connecter pour publier un commentaire.
Vous devez également définir la
contentMode
de laUIImageView
pour obtenir letitleView
correctement affichés dans le paysage et/ou mode portrait :imgView.contentMode=UIViewContentModeScaleAspectFit;
L'ensemble de la séquence: (self est un
UIViewController
exemple)J'ai eu quelque chose de semblable, mais il était de retour (popping) à la racine de la vue-contrôleur. En fin de compte, je suis allé avec le suivant pour les faire éclater:
Et cela a fonctionné. Il peut y avoir une meilleure façon, mais après toutes les heures que j'avais déjà passé sur ce problème, ce qui était assez bon pour moi.
J'ai traité avec cette même question, en gardant la trace de la customView initiale de l'image, basculement entre ça et une échelle de CGRect de la trame initiale dans une setLandscape méthode sur un UIButton sous-classe. J'ai utilisé le UIButton sous-classe comme navigationItem.titleView et navigationItem.rightBarButtonItem.
Dans UIButton sous - classe -
Puis dans le InterfaceOrientation délégués j'ai invoqué le -setLandscape méthode sur la customViews à changer leurs tailles.
Dans UIViewController -
(Pour répondre à ma propre question)
J'ai eu ce travail manuellement en gardant la trace de la titleView les marges de l' (sa distance à partir du bord de la navigtion bar) -- enregistrement lors de l'affichage disparaît, et la restauration lors de l'affichage réapparaît.
L'idée est, nous ne sommes pas la restauration de la titleView à la taille exacte qu'il avait précédemment; plutôt, nous sommes de le restaurer afin qu'il ait le même marges il avait précédemment. De cette façon, si le téléphone a tourné, le titleView aura un nouveau, la taille appropriée.
Voici mon code:
De mon point de vue du contrôleur .h fichier:
De mon point de vue du contrôleur .m fichier:
Pour IOS5 au-delà, comme c'est une vieille question...c'est de Cette façon que j'ai accompli le même problème avec le titre du texte de ne pas aligner correctement.
Testé sur ios5/6 sims fonctionne très bien.
C'est ce que j'ai fait:
La viewTitle est une vue créée dans le xib, il prend la taille de la navigationBar et après qu'il a été ajouté le titleView ajuster la taille pour laisser de la place à l'arrière du bouton. Les Rotations semblent bien fonctionner.
J'avais eu le même problème, mais il me semble pour obtenir la solution de contournement avec le code suivant.
Dans mon cas, l'affichage personnalisé est un objet UITextField, mais j'espère que cela va vous aider.