cocoa-touch - ¿Cómo obtener el ancho y alto de la pantalla en iOS?


¿Cómo se pueden obtener las dimensiones de la pantalla en iOS?

Actualmente, uso:

lCurrentWidth = self.view.frame.size.width;
lCurrentHeight = self.view.frame.size.height;

en viewWillAppear: y willAnimateRotationToInterfaceOrientation:duration:

La primera vez que obtengo el tamaño de pantalla completo. La segunda vez que aparece la pantalla menos la barra de navegación.


Answers


¿Cómo se pueden obtener las dimensiones de la pantalla en iOS?

El problema con el código que publicaste es que estás contando con el tamaño de la vista para que coincida con el de la pantalla, y como has visto, ese no es siempre el caso. Si necesita el tamaño de pantalla, debe mirar el objeto que representa la pantalla en sí, así:

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;

Actualización para vista dividida: en comentarios, Dmitry preguntó:

¿Cómo puedo obtener el tamaño de la pantalla en la vista dividida?

El código proporcionado arriba informa el tamaño de la pantalla, incluso en modo de pantalla dividida. Cuando utilizas el modo de pantalla dividida, la ventana de tu aplicación cambia. Si el código anterior no le brinda la información que espera, entonces al igual que el OP, está buscando el objeto equivocado. En este caso, sin embargo, debe mirar la ventana en lugar de la pantalla, así:

CGRect windowRect = self.view.window.frame;
CGFloat windowWidth = windowRect.size.width;
CGFloat windowHeight = windowRect.size.height;



Cuidado, [UIScreen mainScreen] también contiene barra de estado, si desea recuperar el marco para su aplicación (excluyendo la barra de estado) debe usar

+ (CGFloat) window_height   {
    return [UIScreen mainScreen].applicationFrame.size.height;
}

+ (CGFloat) window_width   {
    return [UIScreen mainScreen].applicationFrame.size.width;
}



He usado estos métodos de conveniencia antes:

- (CGRect)getScreenFrameForCurrentOrientation {
    return [self getScreenFrameForOrientation:[UIApplication sharedApplication].statusBarOrientation];
}

- (CGRect)getScreenFrameForOrientation:(UIInterfaceOrientation)orientation {

    CGRect fullScreenRect = [[UIScreen mainScreen] bounds];

    // implicitly in Portrait orientation.
    if (UIInterfaceOrientationIsLandscape(orientation)) {
      CGRect temp = CGRectZero;
      temp.size.width = fullScreenRect.size.height;
      temp.size.height = fullScreenRect.size.width;
      fullScreenRect = temp;
    }

    if (![[UIApplication sharedApplication] statusBarHidden]) {
      CGFloat statusBarHeight = 20; // Needs a better solution, FYI statusBarFrame reports wrong in some cases..
      fullScreenRect.size.height -= statusBarHeight;
    }

    return fullScreenRect;
} 



He traducido algunas de las respuestas Objective-C anteriores al código Swift. Cada traducción se procede con una referencia a la respuesta original.

Respuesta principal

let screen = UIScreen.main.bounds
let screenWidth = screen.size.width
let screenHeight = screen.size.height

Respuesta de función simple

func windowHeight() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.width
}

Respuesta de orientación del dispositivo

var screenHeight : CGFloat
let statusBarOrientation = UIApplication.sharedApplication().statusBarOrientation
// it is important to do this after presentModalViewController:animated:
if (statusBarOrientation != UIInterfaceOrientation.Portrait
    && statusBarOrientation != UIInterfaceOrientation.PortraitUpsideDown){
    screenHeight = UIScreen.mainScreen().applicationFrame.size.width
} else {
    screenHeight = UIScreen.mainScreen().applicationFrame.size.height
}

Respuesta de registro

let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
println("width: \(screenWidth)")
println("height: \(screenHeight)")



Me doy cuenta de que esta es una publicación anterior, pero a veces me resulta útil #definir constantes como estas, así que no tengo que preocuparme por ello:

#define DEVICE_SIZE [[[[UIApplication sharedApplication] keyWindow] rootViewController].view convertRect:[[UIScreen mainScreen] bounds] fromView:nil].size

La constante anterior debe devolver el tamaño correcto independientemente de la orientación del dispositivo. Entonces obtener las dimensiones es tan simple como:

lCurrentWidth = DEVICE_SIZE.width;
lCurrentHeight = DEVICE_SIZE.height;



Es muy, muy fácil obtener el tamaño de su dispositivo y tener en cuenta la orientación:

// 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];



También debemos considerar la orientación del dispositivo:

CGFloat screenHeight;
// it is important to do this after presentModalViewController:animated:
if ([[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortraitUpsideDown){
    screenHeight = [UIScreen mainScreen].applicationFrame.size.height;
}
else{
    screenHeight = [UIScreen mainScreen].applicationFrame.size.width;
}



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



Aquí lo he actualizado para swift 3

ApplicationFrame obsoleto desde iOS 9

En swift tres han eliminado () y han cambiado pocas convenciones de nomenclatura, puede consultar aquí Enlace

func windowHeight() -> CGFloat {
    return UIScreen.main.bounds.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.main.bounds.size.width
}



Si desea ancho / alto de pantalla independientemente de la orientación del dispositivo (bueno para el tamaño del retrato, solo ver los controladores que se inician desde las orientaciones del paisaje):

CGFloat screenWidthInPoints = [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale;
CGFloat screenHeightInPoints = [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale;

[UIScreen mainScreen] .nativeBounds <- From the docs -> El rectángulo delimitador de la pantalla física, medido en píxeles. Este rectángulo se basa en el dispositivo en una orientación vertical. Este valor no cambia a medida que el dispositivo gira.




Aquí hay una forma rápida de obtener tamaños de pantalla:

print(screenWidth)
print(screenHeight)

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




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




Haga uso de estas Structs para conocer información útil sobre el dispositivo actual en Swift 3.0

struct ScreenSize { // Answer to OP's question

    static let SCREEN_WIDTH         = UIScreen.main.bounds.size.width
    static let SCREEN_HEIGHT        = UIScreen.main.bounds.size.height
}


struct DeviceType { //Use this to check what is the device kind you're working with

    static let IS_IPHONE_4_OR_LESS  = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_SE         = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_7          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_7PLUS      = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
    static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0

}


struct iOSVersion { //Get current device's iOS version

    static let SYS_VERSION_FLOAT  = (UIDevice.current.systemVersion as NSString).floatValue
    static let iOS7               = (iOSVersion.SYS_VERSION_FLOAT >= 7.0 && iOSVersion.SYS_VERSION_FLOAT < 8.0)
    static let iOS8               = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0)
    static let iOS9               = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0)
    static let iOS10              = (iOSVersion.SYS_VERSION_FLOAT >= 10.0 && iOSVersion.SYS_VERSION_FLOAT < 11.0)

}



rápido 3.0

para ancho

UIScreen.main.bounds.size.width

para la altura

UIScreen.main.bounds.size.height



La respuesta moderna:

si su aplicación admite vista dividida en iPad, este problema se vuelve un poco complicado. Necesita el tamaño de la ventana, no la de la pantalla, que puede contener 2 aplicaciones. El tamaño de la ventana también puede variar durante la ejecución.

Usa el tamaño de la ventana principal de la aplicación:

UIApplication.shared.delegate?.window??.bounds.size ?? .zero

Nota: El método anterior puede obtener un valor incorrecto antes de que la ventana se convierta en una ventana clave al iniciarse. si solo necesitas ancho, el método a continuación es muy recomendado :

UIApplication.shared.statusBarFrame.width

La solución anterior que usa UIScreen.main.bounds devolverá los límites del dispositivo. Si su aplicación se ejecuta en modo de vista dividida, obtiene las dimensiones incorrectas.

self.view.window en la respuesta más self.view.window puede tener un tamaño incorrecto cuando la aplicación contiene 2 o más ventanas y la ventana tiene un tamaño pequeño.




Puede colocar estas macros en su archivo pch y usarlas en cualquier lugar del proyecto utilizando "SCREEN_WIDTH"

#define SCREEN_WIDTH                ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height)

y "SCREEN_HEIGHT"

#define SCREEN_HEIGHT               ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation ==   UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width)

Ejemplo de uso:

CGSize calCulateSizze ;
calCulateSizze.width = SCREEN_WIDTH/2-8;
calCulateSizze.height = SCREEN_WIDTH/2-8;