notes apple app ios objective-c ipad

ios - apple - icloud



Detección de dispositivos iPad Pro (10)

Estoy tratando de detectar el dispositivo iPad Pro, tratando de adivinar su altura con:

NSLog(@"%f",self.view.frame.size.height);

¡Pero vuelve 1024 ! Igual que los dispositivos iPad sin retina. algún consejo ?

Necesito especificar algunos códigos exactos para iPad Pro con esta línea de código:

#define iPadPro ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && [UIScreen mainScreen].bounds.size.height == 2732)

... y los códigos deben detectar iPad Pro incluso en simulador de iOS!

Gracias

EDITADO: Algunos sugieren usar LunchScreen, pero cuando lo uso, esto sucede (reducido):


Solución fija para Swift 3+

Hay dos soluciones, la primera que he usado en mi proyecto, puedes usar cualquiera de ellas.

1- Utilizando Macro

2- Usando la Extensión

Usando macro

#define iPadPro129 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad && UIScreen.mainScreen.nativeBounds.size.height == 2732) #define iPadPro105 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad && UIScreen.mainScreen.nativeBounds.size.height == 2224)

Usando la extensión

extension UIDevice { // for ipad pro 12.9 device public var isPadPro129: Bool { if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad && UIScreen.main.nativeBounds.size.height == 2732) { return true } return false } // for ipad pro 10.5 device public var isPadPro105: Bool { if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad && UIScreen.main. nativeBounds.size.height == 2224) { return true } return false } }


Aquí hay una verificación que funcionaría independientemente de la orientación del dispositivo:

- (BOOL)isIpadPro { UIScreen *mainScreen = [UIScreen mainScreen]; CGFloat width = mainScreen.nativeBounds.size.width / mainScreen.nativeScale; CGFloat height = mainScreen.nativeBounds.size.height / mainScreen.nativeScale; BOOL isIpad = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad; BOOL hasIPadProWidth = fabs(width - 1024.f) < DBL_EPSILON; BOOL hasIPadProHeight = fabs(height - 1366.f) < DBL_EPSILON; return isIpad && hasIPadProHeight && hasIPadProWidth; }

Tenga en cuenta que esto solo funciona para iOS8 +


Detecta el iPad pro de 12.9 pulgadas sin importar la orientación del dispositivo.

#define iPadPro12 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad && UIScreen.mainScreen.nativeBounds.size.height == 2732)


Esta no es la mejor solución a largo plazo, pero funcionará para usted hoy ...

Obtener la cadena de hardware para el dispositivo ...

size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = malloc(size); sysctlbyname("hw.machine", machine, &size, NULL, 0); NSString *hardwareString = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding]; free(machine);

Compare la cadena de hardware con estas cadenas hw:

if ([hardwareString isEqualToString:@"iPad6,7"] || [hardwareString isEqualToString:@"iPad6,8"]) { // iPad Pro }

Si lo desea, tengo una clase que envuelve todo esto que podría enviarle. Nunca lo pulí lo suficiente como para hacer una cápsula con él, pero lo tengo disponible si es necesario.


Esto es lo que uso, para swift3 :

extension UIDevice { public class var isiPad: Bool { return UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad } public class var isiPadPro129: Bool { return isiPad && UIScreen.main.nativeBounds.size.height == 2732 } public class var isiPadPro97: Bool { return isiPad && UIScreen.main.nativeBounds.size.height == 2048 } public class var isiPadPro: Bool { return isiPad && (isiPadPro97 || isiPadPro129) } }


Gracias a @ Mc.Lover

Una pequeña actualización para las orientaciones de Portrait y Landscape :

if (([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && ([UIScreen mainScreen].bounds.size.height == 1366 || [UIScreen mainScreen].bounds.size.width == 1366))) { //iPad Pro }


Siguiendo los estándares / prácticas de Swift3, un mejor enfoque sería:

extension UIDevice { public var isiPadPro12: Bool { if UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad && (UIScreen.main.bounds.size.height == 1366 || UIScreen.main.bounds.size.width == 1366) { return true } return false } }

Agregar esto a una extension de UIDevice te permite llamar, lo cual es ordenado:

UIDevice.current.isiPadPro12

¡Un día Apple finalmente nos dará un valor de enum !


Swift 3 versión de la solución de Justin Domnitz de la solución de D1mers0n:

func isIpadPro12() -> Bool { if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad && (UIScreen.main.bounds.size.height == 1366 || UIScreen.main.bounds.size.width == 1366)) { return true } return false }


Un agradecimiento especial a @rmaddy

La forma correcta de detectar tamaños de pantallas es:

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

Ahora, si su aplicación se ejecuta en modo Portrait , simplemente puede usar este código para detectar iPad Pro:

#define iPadPro ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && [UIScreen mainScreen].bounds.size.height == 1366)

No olvide la necesidad de usar LaunchScreen o la aplicación no aprovechará la pantalla más grande del iPad Pro


Versión rápida de la solución de D1mers0n.

func isIpadPro() -> Bool { if (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad && (UIScreen.mainScreen().bounds.size.height == 1366 || UIScreen.mainScreen().bounds.size.width == 1366)) { return true } return false }