2009-08-31 10 views
15

Ich habe eine Ansicht, die in der MainWindow.xib geladen wird. Es ist nur eine Ansicht mit einem uiimageview, die ein Bild auf dem gesamten Bildschirm (320 X 480) zeigt. Wenn die App Lasten zeige ich diese Ansicht und dann mache ich einIPhone - UIView addSubview Abstand oben

[self.view addSubview:tabbarController.view]; 

Tab Bar-Controller nur UITabBarController mit 2 View-Controller ist ihm hinzugefügt. Wenn die Ansicht der tabbarController der Unteransicht hinzugefügt wird, bleibt oben eine Lücke von etwa 20 Pixeln. Meine App hat eine Statusleiste, aber das ist grundsätzlich Platz für ein anderes. Dies geschieht, wenn ich dies meiner Ansicht-Controller hinzufügen:

self.view.frame = CGRectMake(0, 0, 320, 480); 

Kann das jemand erklären. Ich tat

self.view = tabbarController.view; 

aber wurde mir gesagt, ich sollte das nicht tun. Jetzt füge ich eine Unteransicht hinzu, aber ich verstehe nicht, warum ich den CGRect meiner Ansicht anpassen muss, um die 20px nicht anzuzeigen.

Antwort

17

UITabBarController erwartet, dass seine Ansicht als Unteransicht von UIWindow hinzugefügt wird, nicht als Unteransicht einer anderen UIView. Die Eigenschaft frame definiert den Offset der Ansicht in der Superansicht, sodass die UITabBarController-Implementierung den Frame der Ansicht standardmäßig um 20 Pixel versetzt, um Platz für die Statusleiste zu lassen. Sie verwenden UITabBarController nicht standardmäßig, indem Sie ihn einer Ansicht hinzufügen, die bereits um 20 Pixel für die Statusleiste versetzt wurde. UITabBarController versetzt seine Ansicht um weitere 20 Pixel relativ zu seinem Superview, wodurch die Lücke entsteht, die Sie sehen.

Eine saubere Art und Weise, dies zu beheben, ist die Ansicht als Subview des Fensters UITabBarController hinzufügen statt einer Ansicht:

[[[UIApplication sharedApplication] keyWindow] addSubview:tabbarController.view]; 

(Hinweis: Die keyWindow Methode, um Ihre Fenster nur zurück, wenn Sie bereits angerufen haben makeKeyAndVisible.Andernfalls möchten Sie möglicherweise eine Fenstereigenschaft auf Ihrem UIViewController festlegen.)

+0

Vielen Dank für eine klare Erklärung. Vielleicht sollte ich zurückgehen und einen Teil meiner App umstrukturieren. Ich möchte die Dinge auf die richtige Art und Weise tun, aber ich dachte, es wäre besser, die View-Controller-Logik vom App-Delegaten zu trennen - also macht mein Root-View-Controller alles, was er braucht. Das würde erklären, warum ich in meinem Root-View-Controller, wenn ich self.view = tabbarController.view statt als Unteransicht hinzufügen würde, die Lücke nicht bekommen würde. Gute Antwort. Ich würde mehr wählen, wenn ich könnte. – Brian

+0

Es klingt, als wäre dein Instinkt hier gut. Dies ist nur eine der Design-Einschränkungen in Cocoa Touch, für die wir jetzt arbeiten müssen. Bedenken Sie jedoch, dass Sie die tabbarController.view nicht unbedingt von Ihrem App-Delegaten in Ihr Fenster einfügen müssen. Sie können es in Ihrem View-Controller hinzufügen, wenn Sie der Meinung sind, dass dies am sinnvollsten ist. Sie müssen nur Zugriff auf das Fensterobjekt haben, entweder über die keyWindow-Methode oder indem Sie es als Eigenschaft auf Ihrem Controller in applicationDidFinishLaunching: setzen. – cduhn

+0

aber bedeutet das nicht, dass die tabbarcontroller.view jetzt eine Unteransicht der window.view ist? Aber es ist nicht korrekt in meinem Fall habe ich eine Anzeigenansicht und dann eine zweite Inhaltsansicht. Und ich füge die tabbarcontroller.view zur Inhaltsansicht hinzu. Auf diese Weise wird der Viewcontroller den Content/Adview abhängig von den Anzeigen verwalten. Wenn ich die tabbarcontroller.view zum Fenster hinzufüge, glaube ich nicht, dass ich in der Lage sein werde, die Ansichten mit meinem viewcontroller zu handhaben. Was denken Sie? – LolaRun