2010-11-09 12 views
9

Tengo una aplicación basada en la navegación donde coloco mis vistas personalizadas en la vista de navegación.crear una vista mediante programación con el marco establecido en el marco de Superview?

Primero, quiero saber cómo obtener el marco "vista de navegación" para que pueda colocar mi vista personalizada correctamente.
Además, a veces oculto la barra de navegación y quiero asegurarme de obtener correctamente la información del marco. (no con [[UIScreen mainScreen] bounds])

En segundo lugar, en general, ¿cómo accedo al marco de la supervista para que pueda colocar una vista en consecuencia?
Intenté lo siguiente sin éxito.

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

o estableciendo el marco en layoutSubviews, pero noté que layoutSubviews no se llamaba. Supongo que eso se debe a que no tengo ninguna subvista en esta vista en particular.

que

operación -Editar-

Gracias con las respuestas dadas, ahora sé que tengo que configurar el view.frame a los límites de SuperView.
El problema es que no puedo acceder a superview dentro de viewDidLoad.
Veo que la supervista está configurada correctamente en viewWillAppear pero no en viewDidLoad.

descubrí que viewDidLoad es llamado en varias ocasiones, como cuando empujado por pushViewController o acceder self.view
Tengo el siguiente código y viewDidLoad se llama a partir de cero == 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]; 
} 

Ya que no puedo acceder supervista de viewDidLoad, no puedo Esquema de la vista como antes lo hice en viewDidLoad. Esto parece tan inconveniente e innecesariamente complejo.
Cualquier sugerencia por favor?

+0

necesita leer ver jerarquía en iOS. – Tirth

+0

sí, googlearlo. – eugene

Respuesta

10

La propiedad superview es nulo hasta que se añade a su vista como una vista secundaria en alguna parte. En general, no puede saber cuál será la supervista en el método loadView.

Puede usar las propiedades de ajuste automático, como lo sugiere Costique. Consulte Resizing Subviews en the official UIView docs.

También podría establecer el marco después de la llamada a loadView, por ejemplo, en algo como esto:

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

Por cierto, en general es más seguro utilizar la propiedad de los padres bounds para el marco de la subvista . Esto se debe a que los límites de un padre están en el mismo sistema de coordenadas que el marco de la subvista, pero el marco del padre puede ser diferente. Por ejemplo:

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

Gracias, pensé que podría hacer self.view.frame = self.view.superview.bounds; en mi viewDidLoad(). Pero me di cuenta de que estoy creando mi vista dentro de loadView, pero en realidad no he hecho nada para agregarlo a Superview a través de addSubview o cualquier otra cosa. Entonces el código no hace nada. Extraño, pude ver la vista sin agregarla a la vista principal anteriormente. ¿Cómo agrego mi vista (que se creó en loadView) a la vista principal? – eugene

+0

lo siento, me equivoqué al leer mi propio código. Supongo que se agregó al hacer initWithRootViewController de UINavigationController – eugene

7

Sólo hay que establecer la máscara de tamaño automático y el control de navegación hará el resto:

myView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 
+0

ah gracias, funcionaría normalmente, supongo.Pero tengo una vista de desplazamiento como una de myView. Me imagino que configurar AuthorsizingMask para scrollview no funcionaría – eugene

+0

¿Por qué no? UIScrollView es solo una UIView especializada que manipula el origen de sus límites para desplazarse. Lo único que hago diferente es que inicializo UIViews con [UIScreen mainScreen] .applicationFrame en lugar de CGRectZero, pero no creo que importe para nada. – Costique

+0

He intentado su sugerencia. pero en mi viewDidLoad(), [self.view bounds] (a subvistas de diseño) devuelve (0,0,0,0). ¿Me equivoqué en algún lado? ¿Obtienes correctamente [self.view bounds] dentro de viewDidLoad? – eugene

Cuestiones relacionadas