2009-01-28 10 views
5

He creado una aplicación de vistas múltiples que usa varios controladores para mostrar y controlar vistas. El problema que tengo es que, cuando el simulador inicialmente carga la vista, el encabezado está parcialmente cubierto por la barra en la parte superior de la pantalla y la barra de herramientas en la base no está tocando la base de la pantalla. Usé los atributos de tamaño de constructor de interfaz para controlar la vista cuando el iphone gira y funciona perfectamente. Todo encaja perfectamente en el modo horizontal y vertical DESPUÉS de una rotación, pero el problema es con la carga inicial antes de que ocurra una rotación. Sus pensamientos son muy apreciados. TonyUIView Clipped By Statusbar until Autorotate

Respuesta

3

He tenido problemas con las vistas recortadas por estado, navegación y barras de pestañas. He solucionado la mayoría de ellos utilizando la función Métricas simuladas en Interface Builder. De esta manera, lo que expones en IB es mucho más preciso de lo que realmente obtendrás.

18

Tuve que lidiar con este problema durante días y días; no funcionó ninguna cantidad de manipulación en IB.

En última instancia lo tengo para trabajar mediante la adición de esta línea:

mainViewController.view.frame = window.screen.applicationFrame; 

a la aplicación: didFinishLaunchingWithOptions: método. (Donde mainViewController es el UIViewController primario).

+0

Gracias! Estaba luchando con este problema después de crear mi controlador de vista principal de forma manual.Algo en el controlador (una ventana emergente de una vista publicitaria) estaba causando que los niños en la vista cambiasen por la altura de la barra de estado después de que se descartara el anuncio. – DPlusV

+1

+1 porque perdí dos horas tratando de encontrar esta respuesta! –

+0

estaba teniendo el mismo problema, esto funcionó para mí. –

0

El problema es que va a añadir el controlador "incorrectamente", según documentos de Apple (aunque en mi humilde opinión de Apple diseñó mal - el valor por defecto debe ser que usted no necesita cambiar)

si va a tener una barra de estado, Apple requiere que "manualmente" cambie todos sus controladores 20 píxeles (más exactamente, por la altura de la barra de estado, aunque eso es siempre 20 píxeles hoy, Apple le permite solicitar el altura en tiempo de ejecución, desde la propiedad "statusBarFrame" en UIApplication)

clases de Apple - por ejemplo UINavigationController/UITabBarController: se desplazan 20 píxeles automáticamente cuando se agregan a la pantalla. Ambas clases tienen un error en el que harán este cambio , incluso si no son el controlador principal, por lo que su aplicación cambia repentinamente unos 20 píxeles adicionales, dejando 20 píxeles de espacio en blanco en la parte superior.

Pero, cuando giran, esas clases a menudo "hacen las cosas bien" y vuelven a su lugar. O viceversa.

c.f. este enlace para obtener una explicación mucho más detallada de lo que está pasando, y la forma de escribir el código de la forma de Apple quiere que:

http://blog.red-glasses.com/index.php/tutorials/iphone-auto-rotation-for-intermediate-developers-tutorial-1/

+0

El enlace está desactualizado – fpillet

+0

redirigir está roto - intente: http://red-glasses.com/index.php/tutorials/iphone-auto-rotation-for-intermediate-developers-tutorial-1/ – Adam

1

me encontré con este problema también. Específicamente, al mostrar un ADBannerView, toda mi vista cambiará y estará debajo de la barra de estado y dejará un pequeño espacio vacío del tamaño de la barra de estado en la parte inferior de la pantalla del iPhone. He aquí cómo lo resolví: (respuesta de Adán aquí me ayudó a resolver esto):

// In the function that displays an iAD Banner 
CGRect contentFrame = self.view.bounds; 
CGRect myStatusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
CGFloat statusHeight = myStatusBarFrame.size.height; 

// Set the view's origin to be under the status bar. 

contentFrame.origin.y = statusHeight; 

que necesitaba para establecer el origen de mi fin de estar por debajo de la barra de estado, y que resuelto el problema para mí.