inicio - control por boton iphone
Cuadro de aplicación UIScreen que devuelve un rectángulo incorrecto al iniciar la aplicación horizontal(iPhone/iPad) (8)
Tener problemas para obtener los límites correctos para mi aplicación de iPad al iniciarlo en modo horizontal. Tengo las claves adecuadas configuradas en mi archivo Info.plist, y mis controladores de vista se inician correctamente en horizontal (y vertical, natch).
En mi applicationDidFinishLaunching:
método Llamo a un selector después de un retraso de 3 segundos, y ese método realiza una llamada a [[UIScreen mainScreen] applicationFrame]
, pero me devuelve un cuadro de retrato (es decir, altura> ancho).
¿Alguien sabe cómo arreglar esto? Me huele como un error (si es así, archivaré un radar), pero si se trata de un comportamiento intencionado, ¿dónde está documentado?
Cuando sostiene el iPad en orientación horizontal e inicia una aplicación, el controlador de vista inicialmente ve límites para una vista vertical (aunque la orientación informa de paisaje). El controlador de vista obtendrá un mensaje para rotar a orientación horizontal antes de que aparezca.
Entonces, agrega una imagen de lanzamiento y dale el sufijo -568h, de acuerdo con las guías de Apple.
No entiendo por qué cualquier persona con una mente sana haría que la configuración de un sistema dependiera de un gráfico; Pero acabo de probarlo y funcionó.
Aquí está el lugar que me enseñó después de una búsqueda rápida que no vi en esta respuesta, supuse que sería útil para alguien.
S
Esta es la forma en que obtengo el CGRect correcto cuando el controlador de vista está en posición horizontal:
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);
Esto es como está diseñado. Debe consultar el tamaño de su supervisión y ajustar según sea necesario.
Me encontré con el mismo problema al descartar la vista con el complemento dismissViewControllerAnimated in Cordova. Modifiqué el código de canto para el método viewWillAppear en MainViewController, que se redimensionó después de descartar la 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];
}
Nunca confío en [[UIScreen mainScreen] applicationFrame]
, especialmente durante el lanzamiento de la aplicación.
Al crear vistas en código, use la vista de supervisión para establecer su marco.
Si está utilizando xibs con "elementos de interfaz simulados", tendrán el tamaño correcto y todo funcionará a la perfección.
Aplicaciones basadas en UINavigationController
En el caso de una aplicación basada en UINavigationController, tome el marco directamente de self.navigationController.view
, no intente usar [self loadView]
y self.view.superview
. UINavigationController utiliza subvistas "ocultas" para hacer su trabajo, por lo que la supervisión directa no funcionará.
UINavigationController es especial porque durante el inicio de la aplicación, el controlador de navegación cambia el tamaño de sus vistas después de que se llama loadView
. Cuando las patadas de tamaño automático terminan con un pequeño margen en la parte inferior de la pantalla.
¿Por qué no UIScreen
[[UIScreen mainScreen] applicationFrame]
no funciona de manera confiable (especialmente durante el lanzamiento de la aplicación en modo horizontal). Mi experiencia es que la propiedad interfaceOrientation
del controlador de visualización no coincidirá con la orientación de applicationFrame
.
[[UIScreen mainScreen] applicationFrame]
siempre devolverá el rectángulo vertical incluso si la aplicación está en modo horizontal. Esto está relacionado con el hecho de que UIWindow
nunca gira realmente, sino que simplemente cambia la transformación de rootViewController.view
en rootViewController.view
lugar.
Para asegurarse, puede imprimir el objeto de vista raíz en los 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]; ...
CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}