Puede usar algo como UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)para determinar la orientación y luego usar las dimensiones en consecuencia.
SIN EMBARGO, durante un cambio de orientación como en UIViewController
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
Utilice la orientación pasada, toInterfaceOrientationya que el statusBarOrientation de la UIApplication seguirá apuntando a la orientación anterior ya que aún no ha cambiado (ya que está dentro de un willcontrolador de eventos).
Resumen
Hay varias publicaciones relacionadas con esto, pero cada una de ellas parece indicar que tienes que:
- Mire
[[UIScreen mainScreen] bounds]para obtener las dimensiones,
- Compruebe en qué orientación se encuentra y
- Tenga en cuenta la altura de la barra de estado (si se muestra)
Enlaces
Código de trabajo
Normalmente no voy tan lejos, pero despertaste mi interés. El siguiente código debería funcionar. Escribí una categoría sobre la aplicación UIA. Agregué métodos de clase para obtener el tamaño actual o el tamaño en una orientación determinada, que es lo que llamaría en UIViewController willRotateToInterfaceOrientation:duration:.
@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end
@implementation UIApplication (AppDimensions)
+(CGSize) currentSize
{
return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIApplication *application = [UIApplication sharedApplication];
if (UIInterfaceOrientationIsLandscape(orientation))
{
size = CGSizeMake(size.height, size.width);
}
if (application.statusBarHidden == NO)
{
size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
}
return size;
}
@end
Para usar el código simple llame [UIApplication currentSize]. Además, ejecuté el código anterior, así que sé que funciona e informa las respuestas correctas en todas las orientaciones. Tenga en cuenta que tengo en cuenta la barra de estado. Curiosamente, tuve que restar el MIN de la altura y el ancho de la barra de estado.
Espero que esto ayude. :RE
Otros pensamientos
Puede obtener las dimensiones mirando la rootViewControllerpropiedad de UIWindow . He visto esto en el pasado y de manera similar informa las mismas dimensiones tanto en vertical como en horizontal, excepto que informa que tiene una transformación de rotación:
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] vista]
<UILayoutContainerView: 0xf7296f0; marco = (0 0; 320 480); transformar = [0, -1, 1, 0, 0, 0]; autoresize = W + H; layer = <CALayer: 0xf729b80 >>
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] vista]
<UILayoutContainerView: 0xf7296f0; marco = (0 0; 320 480); autoresize = W + H; layer = <CALayer: 0xf729b80 >>
No estoy seguro de cómo funciona su aplicación, pero si no está usando un controlador de navegación de algún tipo, podría tener una vista UIView bajo su vista principal con la altura / ancho máximo de padre y crecer / encoge con padre. Posteriormente, se podría hacer: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]. Eso parece bastante intenso en una línea, pero entiendes la idea.
Sin embargo ... Sería mejor seguir los 3 pasos anteriores en el resumen. Comience a jugar con UIWindows y descubrirá cosas extrañas, como mostrar un UIAlertView cambiará la ventana clave de UIApplication para apuntar a una nueva UIWindow que creó UIAlertView. ¿Quien sabe? ¡Lo hice después de encontrar un error confiando en keyWindow y descubrir que cambió así!