Ich schreibe eine iPhone-App, die (wie die meisten Apps) die automatische Drehung unterstützt: Sie drehen Ihr Telefon, und seine Ansichten werden entsprechend gedreht und skaliert.iOS: Titelansicht der Navigationsleiste ändert sich nicht richtig, wenn das Telefon rotiert
Aber ich eine benutzerdefinierte Ansicht zu navigationItem.titleView
zuweisen (der Titelbereich der Navigationsleiste), und ich kann nicht erhalten, dass die Ansicht korrekt zu ändern, wenn das Telefon rotiert.
Ich weiß, was Sie denken, "Setzen Sie einfach autoresizingMask
auf UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
," aber es ist nicht so einfach. Natürlich, wenn ich nicht die autoresizingMask
Ansicht meiner Ansicht festlegen, ändert meine Ansicht nicht die Größe; und ich möchte, dass sich die Größe ändert.
Das Problem ist, wenn ich tun setze autoresizingMask
, dann ändert sich die Größe korrekt, solange diese Ansicht sichtbar ist; aber die titleView
's Größe wird in diesem Szenario versaut:
- Führen Sie die App, mit dem Telefon im Hochformat gehalten. Alles sieht gut aus.
- Machen Sie etwas, was dazu führt, dass die App eine andere Ansicht auf den Navigationsstapel verschiebt. Z.B. Klicken Sie auf eine Tabellenzeile oder eine Schaltfläche, die einen Aufruf an
[self.navigationController pushViewController:someOtherViewController animated:YES]
verursacht. - Während Sie den Kindercontroller anzeigen, drehen Sie das Telefon auf Querformat.
- Klicken Sie auf die Schaltfläche "Zurück", um zur Ansicht auf oberster Ebene zurückzukehren. An dieser Stelle ist die Titelansicht durcheinander: Obwohl Sie das Telefon im Querformat halten, ist die Titelansicht immer noch so groß, als ob Sie sie im Hochformat halten würden.
- Schließlich, drehen Sie das Telefon zurück in den Hochformat-Modus. Jetzt wird es noch schlimmer: Die Titelansicht verkleinert sich (seit die Navigationsleiste kleiner geworden ist), aber da es schon zu klein war, ist es nun viel zu klein.
Wenn Sie diese Texte selbst reproduzieren möchten, gehen Sie folgendermaßen vor (dies ist ein wenig Arbeit):
- eine App Make Xcode „Navigation-basierte Anwendung“ Assistenten.
- Richten Sie es so ein, dass die Tabellenansicht der obersten Ebene über Zeilen verfügt, die beim Klicken auf eine Detailansicht auf den Navigationsstapel übertragen werden.
Fügen Sie diesen Code sowohl in der Top-Level-View-Controller und der Detailansicht Controller:
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); }
diesen Code Fügen Sie nur in der Top-Level-View-Controller:
- (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; }
Schließlich Folge meinen Reproschritten.
Also ... mache ich etwas falsch? Gibt es eine Möglichkeit, meine Titelansicht immer korrekt zu skalieren?
Nahm deinen Code genau und es funktioniert gut für mich, danke! – esilver
Ich könnte zu spät sein (4-5 Jahre lol), aber darf ich fragen ... in AutoLayout ... passiert Ihnen das "nicht skalierende" Zeug immer noch? Ich arbeite mit Storyboards und UINavigationControllern, wenn ich einen wirklich langen Titel anlege (sagen wir mal 100 Zeichen oder mehr), wenn das iPhone gedreht wird, funktioniert es gut, aber irgendwann behält es die Landschaftsgröße für die Titelansicht bei zum Hochformat gedreht Ich weiß nicht, was ich machen soll. Ohne Personalisierung (Ziehen von Navcontroller + Root View Controller ohne benutzerdefinierte Klassen) geschieht dies immer noch. Es macht mich verrückt, sieht aus wie ein iOS-Bug ... –