IPhone / iPad: ¿Cómo obtener el ancho de la pantalla mediante programación?

83

Hola, me pregunto si hay una manera de obtener el ancho mediante programación.

Estoy buscando algo lo suficientemente general como para adaptarse a 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?? Llevo un tiempo buscando ... ¡gracias!

Interfaz de usuario de Shai
fuente
¿Está buscando el ancho de la pantalla, el ancho del espacio de aplicación disponible (sin la barra del sistema) o el ancho de una vista en particular?
VdesmedT
hrmm no estoy seguro. Supongo que solo quería el ancho del dispositivo (es decir, en ipad 768 para ancho vertical y 1024 para ancho horizontal) pero self.view.bounds parecía satisfacer esto. vea mi comentario a continuación
Shai UI
Vea esta respuesta más completa que tiene en cuenta la orientación del dispositivo.
Drew Stephens
@DrewStephens Vea mi respuesta a continuación, que tiene en cuenta la orientación y solo tiene 3 líneas de código: D.
memmons

Respuestas:

204

Eche un vistazo a UIScreen .

p.ej.

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

Eche un vistazo a la propiedad applicationFrame si no desea que se incluya la barra de estado (no afectará el ancho).

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, asumiendo que este UIView haya sido girado automáticamente por su controlador de vista.

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

Si el controlador de vista no gira automáticamente la vista, deberá verificar la orientación de la interfaz para determinar qué parte de los límites de la vista representa el 'ancho' y la 'altura'. Tenga en cuenta que la propiedad del marco le dará el rect de la vista en el espacio de coordenadas de UIWindow que (por defecto) no tomará en cuenta la orientación de la interfaz.

Alan Rogers
fuente
3
en realidad, esto no funciona cuando el ipad está orientado al paisaje ... es decir, si mi simulador está ejecutando el paisaje, todavía devuelve 768 (en lugar de 1024). ¿Crees que debería tener una declaración if que verifique la orientación en ese caso o hay una mejor manera de obtener el ancho?
Shai UI
Maldita sea, parece que tienes razón; Actualicé mi respuesta con algunas ideas más.
Alan Rogers
Terminé usando "CGFloat width = CGRectGetWidth (self.view.bounds);" en mi método (sin necesidad de didRotateFromInterfaceOrientation) ... así que al menos self.view.bounds tiene en cuenta la orientación. ¡¡Gracias!!
Shai UI
5
para otros que pueden haberse topado con esta publicación anterior, descubrí que self.view.bounds solo es completamente exacto a partir de didRotateFromInterfaceOrientation. También será precisa en viewDidLoad y viewWillAppear si la vista se muestra en su orientación objetivo inicial (como se especifica en IB). Si la vista se muestra en una orientación diferente a la apuntada, se llama a viewDidLoad (y viewWillAppear) antes que didRotateFromInterfaceOrientation y view.bounds será incorrecto
rimsky
En el caso de iOS 6, y cuando usamos controladores modales, no se llamará didRotateFromInterfaceOrientation
Krishnan
12
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
//Bonus height.
CGFloat height = CGRectGetHeight(screen);

fuente
10
no tiene en cuenta la orientación
rimsky
6

Esto se puede hacer 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];
memmons
fuente
3
esto está cerca, pero si se muestra un UIAlertView, será la ventana clave y su propiedad rootViewController será nula
matt bezark
@mattbezark Verdadero. Sin embargo, considero que es un caso de esquina. 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
@memmons un poco tarde para la fiesta, pero me interesaría su solución alternativa :)
alexgophermix
0

A partir de iOS 9.0 no hay forma de obtener la orientación de manera confiable. Este es el código que usé para una aplicación que diseño solo para modo vertical, por lo que si la aplicación se abre en modo horizontal, seguirá siendo precisa:

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

Usa este código te ayudará

[[UIScreen mainScreen] bounds].size.height
[[UIScreen mainScreen] bounds].size.width
Shahzaib Maqbool
fuente
0

utilizar:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ;
Mella
fuente
-2

Aquí hay una forma rápida de obtener tamaños de pantalla, esto también tiene en cuenta la orientación actual de la interfaz:

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 función estándar en:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
fuente