Pregunta

En algunos de mis diseños de aplicaciones o para sólo algunos UIViews, después de un pushViewController navigationController, mi nueva vista se desplazará fuera de la ventana por la altura de la barra de estado. Como resultado de ello, voy a poner este código auxiliar en el método viewDidLoad.

CGRect  frameAt = [self.view frame];
CGRect  statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
frameAt.origin.y += statusBarFrame.size.height;
[self.view setFrame: frameAt];

No tiene sentido para mí que esta es la intención de XCode y el Interface Builder, por lo que sospecho que estoy haciendo algo fundamentalmente equivocado con el SDK durante mi vista de diseño. Por otra parte, en las raras ocasiones en que no tengo que cambiar mi punto de vista, la verdad es que no sé cuál es la diferencia entre los dos enfoques de diseño.

Tenga en cuenta también, que la mayoría de las veces trato de diseñar mis puntos de vista utilizando IB, con algún tipo de personalización menor.

¿Alguien más se encuentra con este y saben lo que hacer para arreglar sin un talón de dicho código?

¿Fue útil?

Solución

He usado barra de navegación de Apple código de ejemplo para tratar y reproducir este problema.

la applicationDidFinishLaunching se implementó originalmente como esto:

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

Si cambio a esto:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[shellController.view addSubview:navigationController.view];
[window addSubview:shellController.view];
[window makeKeyAndVisible];

A continuación, me da la aparición de huecos.

Sin embargo, si sólo hago esto:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[shell addSubview:navigationController.view];
[window addSubview:shell];
[window makeKeyAndVisible];

A continuación, todo parece normal.

Así que supongo que cada controlador de vista compensará su punto de vista si su controlador de vista raíz. Sin embargo, el controlador de navegación anula este comportamiento para compensar su punto de vista, independientemente de si es el controlador de vista raíz. Por lo tanto, yo diría que el hueco está apareciendo porque tienes un mando de navegación en algún lugar más bajo en la jerarquía de lo que se supone que es.

Otros consejos

Lo más importante a tener en cuenta aquí es que un controlador de vista fijará el marco de su propia vista. Esto es porque la cantidad de espacio disponible para la vista puede cambiar durante el tiempo de vida de la aplicación, y solamente el controlador de vista sabe cómo ajustar marco de la vista de manera apropiada. Los ejemplos de cuando la cantidad de cambios espaciales incluye la barra de navegación de cambiar la altura, girando el dispositivo de vertical a horizontal y la barra de estado también puede aumentar en altura si el usuario está tomando una llamada. Debido a esto no se debe modificar el marco de la vista a sí mismo.

Por lo tanto, lo primero que se necesita es es eliminar todo el código relacionado a modifiying marco de la vista.

Ahora tiene que diseñar sus puntos de vista con la mentalidad de que el tamaño de cuadro podría cambiar en cualquier momento. Esto significa establecer la propiedad de tamaño automático de cada subvista correctamente. Si lo hace, entonces no importa si a su vez en las barras de navegación y de estado simulados o no; que están ahí para ayudarle a ver lo que el resultado final se verá como en la mayoría de los casos.

Se puede configurar la propiedad de tamaño automático de cada subvista en Interface Builder en el tamaño Inspector (el que tiene el icono de la regla). En la animación, el cuadro blanco representa la vista raíz del controlador de vista, el cuadro rojo representa la subvista seleccionado actualmente. Se dará cuenta de que la subvista está anclado a la esquina superior izquierda de la vista raíz por defecto. Esto está bien si el tamaño de la vista nunca cambia, pero sabemos que no es cierto. Si tiene subvistas que desea que aparezca en la parte inferior de no importa qué, entonces usted necesita para jugar con el diagrama de la izquierda. La forma en que funciona es que si se selecciona una de las cuatro líneas de todo el borde, entonces la distancia entre el borde de la vista raíz y el borde de la subvista es fijo. Así que si quieres una vista secundaria que aparezca en la parte inferior, lo que necesita para asegurarse de que se selecciona la línea de fondo y la mayoría no la parte superior. Las dos líneas en el medio afectan si el tamaño de la subvista cambia cuando el tamaño de la raíz vista del cambio. Así, por ejemplo, si usted tenía una vista de tabla que quería ocupar toda la altura de la pantalla, debería asegurarse de que se ha seleccionado la línea vertical interior. Esto se llama el modelo de puntales y resortes.

Si va a añadir subvistas programáticamente que necesita para establecer la propiedad autoresizingMask en cada subvista. He aquí una explicación .

Espero que ayude!

texto del enlace

Un error similar se discute aquí.

También es juego de animación en NO? Inténtelo de que SÍ, ya que resuelve un problema similar que estaba enfrentando.

respuesta de Moshy era muy útil como finalmente me di cuenta el significado de las líneas de puntos / sólido en IB para el control de las propiedades de cambio de tamaño de los elementos UIView.

Sin embargo, el ajuste de las propiedades no se refirió a un problema que enfrentan similares con uno de mis puntos de vista. Este punto de vista tenía una barra de estado y la parte superior se define en el IB. Era un ser ligeramente pesado, que contiene una UIWebView que cargar una cadena HTML dentro viewWillAppear y algunos otros elementos de la interfaz.

mientras se carga el punto de vista, si el usuario cambia de repente la orientación del dispositivo de vertical a horizontal, todos los contenidos de la vista se desplazaría hacia abajo por la altura de la barra de estado. El espacio resultante entre los controles de vista y su parte superior se mantendría incluso después de cambiar de nuevo a la orientación vertical.

Lo que finalmente resuelto mis problemas, y mi pelo restante, fue añadiendo la línea:

    self.view.frame = [[UIScreen mainScreen] bounds];

dentro

-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Desde que mi ver su contenido se mantienen en su lugar a pesar de los cambios bruscos de orientación dispositivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top