2010-11-09 13 views
9

Ich habe eine navigationsbasierte Anwendung, wo ich meine benutzerdefinierten Ansichten in der Navigationsansicht platziert.Erstellen Sie eine Ansicht programmgesteuert mit Rahmen auf Superview-Rahmen gesetzt?

Zuerst möchte ich wissen, wie man den Rahmen der "Navigationsansicht" bekommt, damit ich meine benutzerdefinierte Ansicht richtig platzieren kann.
Auch ich manchmal verstecken Navigationsleiste und möchte sicherstellen, dass ich die Frame-Informationen richtig zu bekommen. (nicht mit [[UIScreen mainScreen] Grenzen])

Zweitens, wie kann ich allgemein auf den Superview-Rahmen zugreifen, damit ich eine Ansicht entsprechend platzieren kann?
Ich versuchte das folgende ohne Erfolg.

-(void) loadView { 
[super loadView]; 
UIView* myView = [[UIView alloc] initWithFrame: CGRectZero]; 
self.view = myView; 
self.view.frame = self.view.superview.frame; 
[myView release]; 
} 

oder den Rahmen in layoutSubviews gesetzt, aber bemerkt, dass layoutSubviews nicht aufgerufen wird. Ich vermute, das liegt daran, dass ich in dieser bestimmten Sichtweise keine Unteransichten habe?

Danke

-Edit-

mit gegebenen Antworten, ich weiß jetzt, dass ich die view.frame zu Superview der Grenzen setzen muß.
Das Problem ist, dass ich nicht auf Superview in ViewDidLoad zugreifen kann.
Ich kann sehen, dass Superview korrekt in ViewWillAppear, aber nicht in ViewDidLoad festgelegt ist.

Ich fand heraus, dass viewDidLoad zu verschiedenen Zeiten aufgerufen wird, wie wenn sie von Pushviewcontroller geschoben oder den Zugriff auf self.view
Ich habe den folgenden Code und viewDidLoad von Null aufgerufen wird == controller.view.superview.

if (nil == controller.view.superview) { 
    CGRect frame = scrollView.frame; 
    frame.origin.x = frame.size.width * page; 
    frame.origin.y = 0; 
    controller.view.frame = frame; 
    [scrollView addSubview:controller.view]; 
} 

Da ich nicht Super von viewDidLoad zugreifen kann, kann ich nicht die Ansicht, Layout, wie ich zuvor in viewDidLoad tat. Dies scheint so unbequem und unnötig komplex zu sein.
Irgendwelche Vorschläge bitte?

+0

Sie müssen Ansichtshierarchie in iOS lesen. – Tirth

+0

aye, googling es. – eugene

Antwort

10

Die superview Eigenschaft ist null, bis die Ansicht als Subview irgendwo hinzugefügt wird. Im Allgemeinen können Sie nicht wissen, was die Superview innerhalb der loadView Methode sein wird.

Sie könnten Autoresizing-Eigenschaften verwenden, wie von Costique vorgeschlagen. Schauen Sie sich die Resizing Subviews in the official UIView docs.

Sie auch den Rahmen nach dem Aufruf von loadView, zum Beispiel in etwa wie folgt einstellen könnten:

MyViewController *myController = [[MyViewController alloc] init]; 
myController.view.frame = window.bounds; 
[window addSubview:myController.view]; 

By the way, es ist in der Regel sicherer, die bounds Eigenschaft für den Rahmen des subview der Eltern zu verwenden, . Dies liegt daran, dass sich die Grenzen eines übergeordneten Elements im selben Koordinatensystem wie der Rahmen der Unteransicht befinden, der Rahmen des übergeordneten Elements jedoch unterschiedlich sein kann. Zum Beispiel:

UIView *parentView = /* set up this view */; 
UIView *subView = /* set up subview */; 
[parentView addSubview:subView]; 
parentView.frame = CGRectMake(30, 50, 10, 10); 
subView.frame = subView.superview.frame; // BAD!!! 
// Right now subView's offset is (30, 50) within parentView. 
subView.frame = subView.superview.bounds; // Better. 
// Now subView is in the same position/size as its parent. 
+0

Danke, ich dachte ich könnte tun self.view.frame = self.view.superview.bounds; in meiner SichtDidLoad(). Aber ich habe festgestellt, dass ich meine Ansicht innerhalb von loadView erstelle, aber ich habe nichts unternommen, um sie über addSubview oder irgendetwas hinzuzufügen. Also macht der Code nichts. Seltsamerweise konnte ich die Ansicht sehen, ohne sie zuvor der übergeordneten Ansicht hinzuzufügen. Wie füge ich meine Ansicht (die in loadView erstellt wurde) zur übergeordneten Ansicht hinzu? – eugene

+0

Entschuldigung, ich habe meinen eigenen Code gelesen. Ich denke, es wurde hinzugefügt, wenn initWithRootViewController von UINavigationController – eugene

7

Stellen Sie einfach den automatischen Größen Maske und die Navigationssteuerung erledigt den Rest:

myView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 
+0

ah danke, es würde normalerweise funktionieren, denke ich.Aber ich habe eine Bildlaufansicht als eine von myView. AutoresizingMask auf scrollview einstellen würde nicht funktionieren, nehme ich an? – eugene

+0

Warum nicht? UIScrollView ist nur eine spezialisierte UIView, die den Ursprung ihrer Grenzen für das Scrollen manipuliert. Das einzige, was ich anders mache, ist, dass ich UIViews mit [UIScreen mainScreen] .applicationFrame und nicht mit CGRectZero initialisiere, aber ich glaube nicht, dass es überhaupt von Bedeutung ist. – Costique

+0

Ich habe Ihren Vorschlag ausprobiert. aber in meiner Ansicht gibtDidLoad(), [self.view bounds] (zu Layout-Subviews) zurück (0,0,0,0). Habe ich irgendwo versaut? Erhalten Sie innerhalb von viewDidLoad die richtigen [self.view bounds]? – eugene