UIScreen applicationFrame regresar rectángulo en el inicio de la aplicación incorrecta del paisaje (iPhone / iPad)

StackOverflow https://stackoverflow.com/questions/2664980

Pregunta

Tener problemas para conseguir los límites correctos para mi aplicación IPAD al iniciar en modo horizontal. Tengo las llaves apropiadas establecidas en mi archivo Info.plist, y mis controladores de vista ejecutarán de forma correcta en el paisaje (y retrato, naturalmente).

En mi método applicationDidFinishLaunching: voy a llamar a un selector después de una demora de 3 segundos, y que el método hace una llamada a [[UIScreen mainScreen] applicationFrame], pero me está volviendo un marco vertical (es decir, la altura> ancho).

¿Alguien sabe cómo solucionar este problema? Huele como a un insecto a mí (si es así Archivaré un radar), pero si se pretende comportamiento, ¿dónde está documentado?

¿Fue útil?

Solución

Cuando usted está sosteniendo el iPad en posición horizontal y lanzar una aplicación, el controlador de vista inicialmente ve límites para una vista vertical (a pesar de que los informes de la orientación horizontal). El controlador de vista Obtendrá un mensaje a rotar a la orientación horizontal antes de que aparezca.

Otros consejos

Nunca baso en [[UIScreen mainScreen] applicationFrame], especialmente durante el lanzamiento de aplicaciones.

Al crear vistas en código, utilice el supervista para establecer su marco.

Si está utilizando xibs con elementos de la interfaz "simulados" van a ser del tamaño correcto y todo va a funcionar muy bien.

aplicaciones basadas UINavigationController

En el caso de una aplicación basada en UINavigationController, agarra el bastidor directamente de self.navigationController.view, no trate de usar [self loadView] y self.view.superview. UINavigationController utiliza "oculta" subvistas a hacer su trabajo - por lo que el supervista directa no funcionará

.

UINavigationController es especial porque durante la aplicación de lanzamiento, el control de navegación cambia el tamaño de sus puntos de vista después de loadView se llama. Cuando el tamaño automáticamente patadas en usted termina con un pequeño margen en la parte inferior de la pantalla.

¿Por qué no UIScreen

[[UIScreen mainScreen] applicationFrame] no funciona correctamente (especialmente durante el lanzamiento de aplicaciones en el paisaje). Mi experiencia es que la propiedad de la interfaceOrientation viewcontroller no coincidirá con la orientación applicationFrame.

CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}

Esta es la manera tengo la CGRect correcta cuando el controlador de vista es en el paisaje:

CGRect landscapeBounds;
if (self.view.frame.size.width < self.view.frame.size.height)
    landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width);
else
    landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);

Este es tal como se ha diseñado. Usted debe consultar el tamaño de su supervista y ajustar según sea necesario.

[[UIScreen mainScreen] applicationFrame] siempre devolverá el rectángulo vertical aunque la aplicación es en modo horizontal. Esto está relacionado con el hecho de que UIWindow no en realidad gira, pero sólo cambia la transformada de rootViewController.view lugar.

Para asegurarse, puede imprimir el objeto vista raíces en modos vertical y horizontal, y verá algo como esto:

Retrato:

<UIView: 0x96290e0; frame = (0 20; 768 1004); ...

paisaje:

<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...

Por lo tanto, añadir una imagen de lanzamiento y darle la -568h sufijo, de acuerdo a las guías de Apple.

No entiendo por qué alguien con una mente sana haría un ajuste del sistema dependerá de un gráfico; pero yo sólo probé y funcionó.

Aquí es el lugar que me enseñó después de una búsqueda rápida no vi esta respuesta anterior, pensé que sería útil a alguien.

S

Me metí en mismo problema al despedir a la vista con dismissViewControllerAnimated en Córdoba plugin. He modificado el código para el método singingAtom viewWillAppear en MainViewController, que consiguió cambiar el tamaño después de despedir vista modal:

- (void)viewWillAppear:(BOOL)animated
    {
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIDeviceOrientationLandscapeLeft == orientation || 
        UIDeviceOrientationLandscapeRight == orientation)
            {
            if (appFrame.size.width < appFrame.size.height)
                {
                appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
                }
        }
    self.view.frame = appFrame;
    [super viewWillAppear:animated];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top