2010-09-07 11 views
73

Hola, me pregunto si hay una manera de obtener el ancho programáticamente.IPhone/IPad: ¿Cómo obtener ancho de pantalla mediante programación?

Estoy buscando algo lo suficientemente general como para acomodar iphone 3gs, iphone 4, ipad. Además, el ancho debería cambiar en función de si el dispositivo es vertical u horizontal (para ipad).

¿Alguien sabe cómo hacer esto? He estado buscando por un tiempo ... ¡gracias!

+0

es el ancho de la pantalla, la anchura del espacio de aplicaciones disponibles (sin la barra del sistema) o la anchura de una visión particular estas buscando? – VdesmedT

+0

hrmm no estoy seguro. Supongo que solo quería el ancho del dispositivo (es decir, en ipad 768 para ancho de retrato y 1024 para ancho de paisaje) pero self.view.bounds parecía satisfacer esto. vea mi comentario a continuación – foreyez

+0

Vea [esta respuesta más completa] (http://stackoverflow.com/a/7905540/17339) que toma en cuenta la orientación del dispositivo. –

Respuesta

179

Eche un vistazo a UIScreen.

por ejemplo.

CGFloat width = [UIScreen mainScreen].bounds.size.width; 

Tome un vistazo a la propiedad applicationFrame si no desea que la barra de estado incluido (no afecta a la anchura).

ACTUALIZACIÓN: Resulta que UIScreen (-bounds o -applicationFrame) no tiene en cuenta la orientación actual de la interfaz. Un enfoque más correcto sería preguntarle a su UIView por sus límites, suponiendo que este UIView haya sido rotado automáticamente por su controlador View.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    CGFloat width = CGRectGetWidth(self.view.bounds); 
} 

Si la vista no se está haciendo girar-auto por el controlador de vista, entonces tendrá que comprobar la orientación de interfaz para determinar qué parte de la vista fuera representa la 'ancho' y 'altura'. Tenga en cuenta que la propiedad del marco le dará la rect de la vista en el espacio de coordenadas de UIWindow que (de forma predeterminada) no tendrá en cuenta la orientación de la interfaz.

+3

en realidad, esto no funciona cuando el ipad está orientado al paisaje ... es decir, si mi simulador está ejecutando el paisaje, entonces todavía devuelve 768 (en lugar de 1024). ¿Crees que debería tener una declaración if que compruebe la orientación en ese caso o hay una mejor manera de obtener ancho? – foreyez

+0

Maldición: parece que tienes razón; He actualizado mi respuesta con algunas ideas más. –

+0

Terminé simplemente usando "CGFloat width = CGRectGetWidth (self.view.bounds);" en mi método (sin necesidad de didRotateFromInterfaceOrientation) ... al menos self.view.bounds tiene en cuenta la orientación. ¡¡Gracias!! – foreyez

9
CGRect screen = [[UIScreen mainScreen] bounds]; 
CGFloat width = CGRectGetWidth(screen); 
//Bonus height. 
CGFloat height = CGRectGetHeight(screen); 
+10

no tiene en cuenta la orientación – rimsky

5

Esto se puede hacer de en 3 líneas de código:

// grab the window frame and adjust it for orientation 
UIView *rootView = [[[UIApplication sharedApplication] keyWindow] 
            rootViewController].view; 
CGRect originalFrame = [[UIScreen mainScreen] bounds]; 
CGRect adjustedFrame = [rootView convertRect:originalFrame fromView:nil]; 
+3

esto está cerca, pero si se muestra un UIAlertView será la ventana clave y su propiedad rootViewController será nula –

+0

@mattbezark True. Considero que es un caso de esquina sin embargo. Existe una alternativa para obtener la vista raíz, no tan limpia como esta, pero publicaré la alternativa en caso de que alguien esté interesado. – memmons

+0

Gracias. Este trabajo en iOS 7 y 8. –

-2

Aquí es una forma rápida de conseguir tamaños de pantalla, esto también lleva a la orientación actual de la interfaz en cuenta:

var screenWidth: CGFloat { 
    if UIInterfaceOrientationIsPortrait(screenOrientation) { 
     return UIScreen.mainScreen().bounds.size.width 
    } else { 
     return UIScreen.mainScreen().bounds.size.height 
    } 
} 
var screenHeight: CGFloat { 
    if UIInterfaceOrientationIsPortrait(screenOrientation) { 
     return UIScreen.mainScreen().bounds.size.height 
    } else { 
     return UIScreen.mainScreen().bounds.size.width 
    } 
} 
var screenOrientation: UIInterfaceOrientation { 
    return UIApplication.sharedApplication().statusBarOrientation 
} 

Estos se incluyen como una función estándar en:

https://github.com/goktugyil/EZSwiftExtensions

0

A partir de iOS 9.0 no hay forma de obtener la orientación de manera confiable. Este es el código que he usado para una aplicación Yo diseño para el modo de retrato solamente, por lo que si la aplicación se abre en el modo de paisaje todavía será preciso:

screenHeight = [[UIScreen mainScreen] bounds].size.height; 
screenWidth = [[UIScreen mainScreen] bounds].size.width; 
if (screenWidth > screenHeight) { 
    float tempHeight = screenWidth; 
    screenWidth = screenHeight; 
    screenHeight = tempHeight; 
} 
0

utilizar el código que le ayudará

[[UIScreen mainScreen] bounds].size.height 
[[UIScreen mainScreen] bounds].size.width 
0

uso:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ; 
Cuestiones relacionadas