Zusammenfassung: Wie sollte die UIViewController
die Größe seiner UIView-Instanz beim Initialisieren dieser Ansicht kennen?
Die spezielle Initialisierungsmethode für eine UIView ist die initWithFrame:(CGRect)frame
Methode. Damit wird der Rahmen für die neu erstellte UIView festgelegt. Diese Methode kann von der Methode UIViewController's
loadView-Methode, wenn die Ansicht dieses View-Controllers angefordert wird. Die Dokumentation von UIViewController
Zustände in Bezug auf Unterklassenbildung und Ansichtsgröße:
Bei der Erstellung der Ansichten Hierarchie, sollten Sie immer die Auto-Sizing-Eigenschaften Ihrer Views einstellen. Wenn ein View Controller auf dem Bildschirm angezeigt wird, wird seine Root-View normalerweise Größe an den verfügbaren Platz angepasst, der je nach der aktuellen aktuellen Ausrichtung des Fensters und der Vorhandensein von anderen Oberflächenelementen wie zum Beispiel der Statusleiste.
Also, die UIViewController
Instanz sollten diese Eigenschaften eingestellt werden. So weit so gut, die UIViewController
muss bisher nicht wissen, wie groß seine Aussicht ist oder sein wird.
Wenn die Ansicht eines UIViewController
angefordert wird und die View-Eigenschaft Null ist, wird die loadView-Methode des View-Controllers aufgerufen. Nun gibt es ein Problem, denn die UIView
muss initialisiert werden, aber der View-Controller weiß noch nicht, welche Größe der View haben soll. Wie groß soll der View initialisiert werden? Wo im Code bestimmen Sie die Größe der Ansicht?
Sie könnten die Ansicht mit einem Null-Rect initialisieren ( CGRectZero
) :
- (void)loadView {
self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}
Und lassen Sie den Aufrufer den Ansichtsrahmen wie folgt festlegen:
UIViewController *viewController = [[MyUIViewController alloc] init];
// next two lines are normally combined, but for clarity they are not now
UIView *view = viewController.view;
view.frame = CGRectMake(0, 0, 200, 200);
Dieser fordert den View vom View-Controller (viewController.view) an und lädt somit dessen View mit der Methode loadView. Diese loadView-Methode initialisiert den View mit einer CGRectZero
. Dann setzt der Aufrufer seinen Rahmen (view.frame = ...)
Das Problem ist, dass die Frame-Eigenschaft der Ansicht zweimal gesetzt wird, was möglicherweise noch mehr doppelte Arbeit verursacht, wenn Ihre benutzerdefinierte UIView
macht einige erweiterte Layout in der setFrame-Methode (Platzierung und Größenänderung von Unteransichten zum Beispiel). Sie könnten dies verhindern, indem Sie eine eigene Initialisierungsmethode für die UIViewController
das den Aufrufer bereits nach einem CGRect fragt, das Sie in einem Ivar speichern würden. Zum Zeitpunkt des Aufrufs der loadView-Methode verwenden Sie dieses Ivar, um die Ansicht zu erstellen.
Was ist hier der richtige Weg? Entweder wird der Rahmen der Ansicht zweimal gesetzt (Initialisierung mit CGRectZero
und anschließend setzen), oder die Angabe der UIViewController
eine neue Initialisierungsmethode mit einem CGRect (und damit eine Rahmeneigenschaft)? Oder übersehe ich etwas und gibt es andere Möglichkeiten?