2011-05-16 12 views
5

Tenía la impresión de que la barra de navegación de UINavigationController siempre empuja hacia abajo la altura de la vista secundaria, de modo que el origen de la vista secundaria estaba en la parte inferior de la barra de título.¿Por qué la altura de mi vista raíz no tiene en cuenta su barra de navegación?

Pero cuando presente un controlador de vista como esta ...

MyViewController *viewController = [[MyViewController alloc] init]; 
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
viewController.title = @"My View Controller"; 
viewController.navigationItem.prompt = @"My Prompt"; 
viewController.delegate = self; 

[self presentModalViewController:navigationController animated:YES]; 
[navigationController release]; [viewController release]; 

... y después comprobar self.view.frame.size.height con un NSLog en viewDidLoad, informa de que mi opinión es 460 píxeles de alto. ¿No debería restar el alto de mi título &?

+0

¿Ha iniciado sesión 'self.view.frame.size.height' en' viewWillAppear' también? Por la parte superior de mi cabeza, el comportamiento típico es que la vc se cambie de tamaño solo cuando se muestra a la vista. – lxt

+0

@lxt ¡tienes toda la razón! Por favor, vuelva a escribir eso en una respuesta para que pueda marcarlo como correcto :) –

+0

Me alegro de poder ayudarlo. Han reescrito a continuación. – lxt

Respuesta

18

Por lo tanto, conforme a lo solicitado:

Cuando se llama a viewDidLoad el controlador de vista no se ha introducido en la pantalla todavía. Por lo tanto, cuando obtiene el tamaño del marco dentro de ese método, informará que es "predeterminado" (por lo general, 320 x 480 para una aplicación de iPhone).

La vista se vuelve a traducir automáticamente para tener en cuenta la barra de navegación. Entonces, cuando compruebe el tamaño del marco en viewWillAppear, ahora será correcto. Por lo general, esto no es un problema para las aplicaciones de iPhone. Para las aplicaciones de iPad, donde tiene múltiples orientaciones, ¡puede ser un poco doloroso!

Existen algunas excepciones a esto, por ejemplo, cuando se utilizan NIB.

3

Probablemente te refieres incorrectoself aquí. Cuando self se refiere a la instancia MyViewController probablemente tendrá una altura de 460 - 44 píxeles (estándar UIToolbar altura), pero si self se refiere a un controlador de vista principal (por ejemplo, el controlador de vista de navegación) verá la altura de vista estándar (por ejemplo, 460px).

Puede verificar esto llamando al self.view.frame.size.height dentro de la instancia de MyViewController, p. Ej. cuando la vista ha terminado de cargarse (método viewWillAppear:), y su controlador de navegación ya lo ha redimensionado.

Si llama al self.view.frame.size.height desde el método viewDidLoad, la vista probablemente aún no ha sido redimensionada por su controlador principal.

Vuelva a intentarlo y avíseme si esto solucionó su problema.

+0

Estoy un poco confundido, ¿no sería el "yo" lo mismo, ya sea en 'viewDidLoad' o' viewWillAppear'? Efectivamente hace la diferencia (funciona como esperaba en 'viewWillAppear'), pero sospecho que es porque la vista aún no se ha redimensionado en' viewDidLoad', como lxt sugiere más arriba. –

+0

Sí, tienes razón, el "yo" es el mismo en esos dos métodos, pensé que lo estabas llamando desde otro lugar. El 'viewWillAppear:' se llama una vez que se ha dibujado la vista, por lo que ya se ha redimensionado a las dimensiones correctas. Acabo de actualizar la respuesta. – marzapower

Cuestiones relacionadas