2010-11-09 39 views
9

J'ai une application basée sur la navigation où je place mes vues personnalisées dans la vue de navigation. Premièrement, je veux savoir comment obtenir l'image de "navigation" afin que je puisse placer ma vue personnalisée correctement.
En outre, je cache parfois la barre de navigation et je veux m'assurer que je reçois les informations sur l'image correctement. (pas avec les limites [[UIScreen mainScreen]])créer une vue par programmation avec cadre défini à l'image de superview?

Deuxièmement, en général, comment puis-je accéder à la vue de l'aperçu pour pouvoir placer une vue en conséquence?
J'ai essayé ce qui suit sans succès.

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

ou de définir le cadre dans layoutSubviews, mais remarqué layoutSubviews pas appelé Je suppose que c'est parce que je n'ai pas de sous-vues dans cette vue particulière?

Merci

-Edit-

avec réponses, je sais maintenant que je dois mettre le view.frame aux limites de SuperView.
Le problème est que je ne peux pas accéder à superview dans viewDidLoad.
Je peux voir que superview est correctement défini dans viewWillAppear mais pas dans viewDidLoad.

Je trouve que viewDidLoad est appelée à plusieurs reprises, comme lorsqu'il est poussé par pushViewController ou l'accès à self.view
Je le code suivant et viewDidLoad est appelé de zéro == 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]; 
} 

Depuis que je ne peux pas accéder à superview de viewDidLoad, je ne peux pas le point de vue mise en page comme je l'ai déjà fait dans viewDidLoad. Cela semble si incommode et inutilement complexe.
Une suggestion, s'il vous plaît?

+0

Vous devez lire la hiérarchie des vues dans iOS. – Tirth

+0

oui, googling it. – eugene

Répondre

10

La propriété superview est nul jusqu'à ce que votre point de vue est ajouté en tant que sous-vue quelque part. En général, vous ne pouvez pas savoir ce que sera la superposition dans la méthode loadView.

Vous pouvez utiliser des propriétés d'autoresizing, comme suggéré par Costique. Consultez les Redimensionnement des sous-vues dans the official UIView docs.

Vous pouvez également définir le cadre après l'appel à loadView, par exemple quelque chose comme ceci:

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

Par ailleurs, il est généralement plus sûr d'utiliser le cadre de la sous-vue propriété bounds du parent . C'est parce que les limites d'un parent sont dans le même système de coordonnées que le cadre de la sous-vue, mais le cadre du parent peut être différent. Par exemple:

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

Merci, je pensais que je pouvais faire self.view.frame = self.view.superview.bounds; dans mon viewDidLoad(). Mais j'ai remarqué que je crée ma vue à l'intérieur de loadView mais je n'ai rien fait pour l'ajouter à superview via addSubview ou quoi que ce soit. Donc le code ne fait rien. Bizarre, j'étais capable de voir la vue sans l'ajouter à la vue parent auparavant. Comment ajouter ma vue (qui a été créée dans loadView) à la vue parente? – eugene

+0

désolé j'ai foiré en lisant mon propre code. Je suppose qu'il a été ajouté lors de l'exécution de initWithRootViewController de UINavigationController – eugene

7

Il suffit de définir le masque de Autoresizing et le contrôleur de navigation fera le reste:

myView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 
+0

ah merci, cela fonctionnerait normalement je suppose.Mais j'ai une vue de défilement comme myView. réglage autoresizingMask à scrollview ne fonctionnerait pas, je suppose? – eugene

+0

Pourquoi pas? UIScrollView est juste un UIView spécialisé qui manipule l'origine de ses limites pour le défilement. La seule chose que je fais différemment est que j'initialise UIViews avec [UIScreen mainScreen] .applicationFrame au lieu de CGRectZero, mais je ne pense pas que ce soit important. – Costique

+0

J'ai essayé votre suggestion. mais dans mon viewDidLoad(), [self.view bounds] (pour mettre en page les sous-vues) renvoie (0,0,0,0). ai-je gâché quelque part? Est-ce que vous obtenez les [limites de self.view] correctes dans viewDidLoad? – eugene