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, toInterfaceOrientation
ya 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 will
controlador 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 rootViewController
propiedad 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í!
applicationFrame
lugar debounds
(en la pantalla UIS), no tiene que restar la altura de la barra de estado.mainScreen().bounds.size
ha vuelto dependiente de la orientación desde iOS 8 en adelante¡Este es mi código de solución! Este método puede agregarse al Categroy de la clase NSObject, o puede definir una clase UIViewController personalizada superior, y dejar que todos sus otros UIViewControllers la hereden.
Tenga en cuenta , después de IOS8, como dice la propiedad de límites de Apple Document of UIScreen :
Entonces, para considerar la compatibilidad, debemos detectar la versión de IOS y realizar el cambio de la siguiente manera:
fuente
Aquí hay una macro útil:
fuente
En iOS 8+ debes usar el
viewWillTransitionToSize:withTransitionCoordinator
método:Esto reemplaza el método de animación obsoleto que no proporcionó información sobre el tamaño:
fuente
A partir de iOS 8, los límites de pantalla ahora se devuelven correctos para la orientación actual. Esto significa que un iPad en orientación horizontal [UIScreen mainScreen] .bounds devolvería 768 en iOS <= 7 y 1024 en iOS 8.
Lo siguiente devuelve la altura y el ancho correctos en todas las versiones publicadas.
fuente
si desea el tamaño dependiente de la orientación y tiene una vista, puede usar:
fuente
Escribí categoría para
UIScreen
, que funciona en todas las versiones de iOS, por lo que se pueden utilizar de esta manera:[[UIScreen mainScreen] currentScreenSize]
.fuente
Aquí hay una forma rápida de obtener tamaños de pantalla dependientes de la orientación:
Estos se incluyen como una función estándar en un proyecto mío:
https://github.com/goktugyil/EZSwiftExtensions
fuente
fuente
Sin embargo, en iOS 8.0.2:
fuente
use -> setNeedsDisplay () para la vista que desea cambiar de tamaño.
fuente