Frage

In einige meiner Anwendung Design oder nur für einige UIViews, nach einem Navigation des Pushviewcontroller, meine neue Ansicht wird durch die Höhe der Statusleiste aus dem Fenster verschoben werden. Als Ergebnis werde ich diesen Code Stub in der viewDidLoad Methode setzen.

CGRect  frameAt = [self.view frame];
CGRect  statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
frameAt.origin.y += statusBarFrame.size.height;
[self.view setFrame: frameAt];

Es macht keinen Sinn für mich, dass dies die Absicht von XCode und Interface Builder ist, so vermute ich, dass ich etwas grundlegend falsch mit dem SDK während meiner Ansicht Entwurf tue. Darüber hinaus bei der seltenen Gelegenheit, dass ich meine Ansicht nicht verschieben müssen, ich weiß wirklich nicht, was der Unterschied in den beiden Designansätze.

Beachten Sie auch, dass die meisten der Zeit, die ich versuche, meine Ansichten zu entwerfen IB verwenden, mit einigen kleineren Anpassungen.

Hat jemand in diesem Lauf und wissen, was sie ohne einen solchen Code Stub fix tun?

War es hilfreich?

Lösung

Ich habe Apples NavBar Beispielcode verwendet, um zu versuchen und reproduzieren dieses Problem.

das applicationDidFinishLaunching ursprünglich wie folgt implementiert:

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

Wenn ich es dies zu ändern:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[shellController.view addSubview:navigationController.view];
[window addSubview:shellController.view];
[window makeKeyAndVisible];

Dann bekomme ich die Lücke erscheinen.

Allerdings, wenn ich dies nur tun:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[shell addSubview:navigationController.view];
[window addSubview:shell];
[window makeKeyAndVisible];

Dann sieht alles normal.

So ich jeden View-Controller denke, seine Ansicht versetzt wird, wenn seine die Wurzel-View-Controller. Aber die Navigation-Controller überschreibt dieses Verhalten seine Ansicht zu kompensieren, unabhängig davon, ob es sich um die Wurzel-View-Controller. Deshalb würde ich sagen, dass Ihre Lücke erscheint, weil Sie einen Navigationscontroller irgendwo in der Hierarchie niedriger haben, als es angenommen hat, sein.

Andere Tipps

Die Hauptsache hier im Auge zu behalten ist, dass ein View-Controller den Rahmen seiner Ansicht selbst festgelegt werden. Dies liegt daran, die Menge an Speicherplatz zur Verfügung, die Sicht während der Lebensdauer der App können sich ändern, und nur die View-Controller weiß, wie die Ansicht des Rahmens entsprechend anzupassen. Beispiele, wenn die Menge an Speicherplatz Änderungen umfasst die Navigationsleiste Höhe zu verändern, drehen Sie das Gerät vom Hoch- ins Querformat und die Statusleiste kann auch in der Höhe erhöhen, wenn der Benutzer einen Anruf stattfindet. Aus diesem Grund sollten Sie nicht den Rahmen selbst ist der Ansicht ändern.

Also, das erste, was Sie brauchen, ist ist der gesamte Code entfernen bezogen auf modifiying des Frames Ansicht.

Jetzt müssen Sie Ihre Ansichten entwerfen mit der Einstellung, dass die Rahmengröße jederzeit ändern könnte. Dieses Mittel richtig die automatischen Größen Eigenschaft jeder Subview Einstellung. Wenn Sie dies tun, dann wird es nicht egal, ob Sie auf den simulierten Navigation und Statusleisten drehen oder nicht; sie sind nur dort zu helfen Sie sehen, was das Endergebnis, wie in den meisten Fällen aussehen wird.

Sie können das die automatische Eigenschaft jeden Subview in Interface Builder in der Größe Inspector (der mit dem Lineal-Symbol). In der Animation stellt das weiße Feld der Stammansicht des View-Controllers stellt das rote Feld die aktuell ausgewählte subview. Sie werden bemerken, dass die Subview der oberen linken Ecke des Root-Ansicht standardmäßig verankert ist. Das ist in Ordnung, wenn die Größe der Ansicht ändert sich nie, aber wir wissen, dass das nicht wahr zu sein. Wenn Sie Subviews, dass Sie am unteren Rand erscheinen soll keine Materie-was, dann müssen Sie mit dem Diagramm auf der linken Seite spielen. Die Art, wie es funktioniert, ist, wenn eine der vier Zeilen um die Kante ausgewählt wird, dann ist der Abstand zwischen dieser Kante des Stammansicht und der Kante des subview befestigt ist. Wenn Sie also ein Subview wollen am unteren Rand angezeigt werden soll, müssen Sie sicherstellen, dass die am weitesten unten Zeile ausgewählt ist und nicht die Spitze. Die beiden Linien in der Mitte Einfluss darauf, ob die Größe des subview ändert sich, wenn die Stammansicht Größe ändern. So zum Beispiel, wenn Sie eine Tabellenansicht haben, die Sie über die gesamte Höhe des Bildschirms besetzen wollten, würden Sie sicher, dass die innere vertikale Linie ausgewählt wurde. Dies ist die Streben und Federn Modell genannt.

Wenn Sie hinzufügen Subviews programmatisch müssen Sie auf jedem subview die autoresizingMask Eigenschaft festzulegen. Hier ist eine Erklärung .

Ich hoffe, das hilft!

Ich habe in ähnliche Probleme laufen. Schauen Sie sich meine beiden vorangegangenen Fragen:

IPhone - Nach Entlassen Modal-View-Controller - Lücke wird oben auf der Seite links

IPhone - UIView addSubview Gap oben

Link-Text

Ein ähnlicher Fehler wird hier diskutiert.

Auch ist Animation auf NO gesetzt? Versuchen Sie es auf YES einstellen, da dies ein ähnliches Problem gelöst war ich gegenüber.

Moshy Antwort war sehr hilfreich, da ich endlich die Bedeutung der gepunkteten / gezogenen Linien in IB zur Steuerung der Größe ändern Eigenschaften von UIView Elemente realisiert.

Allerdings hat diese Eigenschaften Einstellung nicht ein ähnliches Problem, das ich mit einem meiner Ansichten konfrontiert sprechen. Diese Ansicht hatte einen Status und obere Leiste in IB definiert. Es war ein wenig schwer ein, enthält eine UIWebView, die einen HTML-Zeichenfolge innerhalb viewWillAppear und ein paar anderen Elemente der Benutzeroberfläche geladen werden würden.

, während die Ansicht laden, wenn der Benutzer plötzlich die Orientierung der Vorrichtung von Hochformat auf Querformat gewechselt wird alle Inhalte der Ansicht würde Verschiebung nach unten durch die Höhe der Statusleiste. Die sich ergebende Zwischenraum zwischen den Kontrollen und Ansicht seiner Oberseite würde bleiben auch nach hinten, um im Hochformat umgeschaltet wird.

Was meine Probleme endlich gelöst, und meine restlichen Haare, wurde das Hinzufügen der Zeile:

    self.view.frame = [[UIScreen mainScreen] bounds];

innerhalb

-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Seit meiner Ansicht Inhalt gehalten wird anstelle trotz abrupter Geräteausrichtung ändert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top