Mi aplicación de iOS utiliza una altura personalizada para la UINavigationBar
que da algunos problemas en el nuevo iPhone X.
Alguien sabe ya cómo confiar en la detección programática (en Objective-C) si una aplicación se ejecuta en el iPhone X?
EDIT:
Por supuesto, la comprobación del tamaño de la pantalla es posible, sin embargo, me pregunto si hay algún "build in" método como TARGET_OS_IPHONE
para detectar iOS...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}
EDIT 2:
No creo que mi pregunta sea un duplicado de la pregunta enlazada. Por supuesto, hay métodos para "medir" diferentes propiedades del dispositivo actual y utilizar los resultados para decidir qué dispositivo se utiliza. Sin embargo, este no era el punto real de mi pregunta como traté de enfatizar en mi primera edición.
La pregunta real es: "¿Es posible detectar directamente si el dispositivo actual es un iPhone X (por ejemplo, por alguna función del SDK) o tengo que utilizar mediciones indirectas"?
Por las respuestas dadas hasta ahora, supongo que la respuesta es "No, no hay métodos directos. Las mediciones son el camino a seguir".
Según su pregunta, la respuesta es no. No hay métodos directos. Para más información puede obtenerla aquí:
y
La altura del iPhone X es de 2436 px
Desde Tamaños de pantalla de dispositivos y resoluciones:
[]
De Tamaños y orientaciones de la pantalla del dispositivo:
Swift 3 y posteriores:
if UIDevice().userInterfaceIdiom == .phone {
switch UIScreen.main.nativeBounds.height {
case 1136:
print("iPhone 5 or 5S or 5C")
case 1334:
print("iPhone 6/6S/7/8")
case 1920, 2208:
print("iPhone 6+/6S+/7+/8+")
case 2436:
print("iPhone X/XS/11 Pro")
case 2688:
print("iPhone XS Max/11 Pro Max")
case 1792:
print("iPhone XR/ 11 ")
default:
print("Unknown")
}
}
Objetivo-C:
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
switch ((int)[[UIScreen mainScreen] nativeBounds].size.height) {
case 1136:
printf("iPhone 5 or 5S or 5C");
break;
case 1334:
printf("iPhone 6/6S/7/8");
break;
case 1920, 2208:
printf("iPhone 6+/6S+/7+/8+");
break;
case 2436:
print("iPhone X/XS/11 Pro");
break;
case 2688:
print("iPhone XS Max/11 Pro Max");
break;
case 1792:
print("iPhone XR/ 11 ");
break;
default:
printf("Unknown");
break;
}
}
Xamarin.iOS:
if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone) {
if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1136) {
Console.WriteLine("iPhone 5 or 5S or 5C");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1334) {
Console.WriteLine("iPhone 6/6S/7/8");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1920 || (UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2208) {
Console.WriteLine("iPhone 6+/6S+/7+/8+");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2436) {
Console.WriteLine("iPhone X, XS, 11 Pro");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2688) {
Console.WriteLine("iPhone XS Max, 11 Pro Max");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1792) {
Console.WriteLine("iPhone XR, 11");
} else {
Console.WriteLine("Unknown");
}
}
Basado en su pregunta como sigue:
O utilizar screenSize.height
como float 812.0f
no int 812
.
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
// 812.0 on iPhone X, XS
// 896.0 on iPhone XS Max, XR.
if (screenSize.height >= 812.0f)
NSLog(@"iPhone X");
}
Para más información puede consultar la siguiente página en iOS Human Interface Guidelines:
Swift:
Detectar con topNotch
:
Si alguien está considerando el uso de la muesca para detectar el iPhoneX, tenga en cuenta que en "paisaje" es igual para todos los iPhones.
var hasTopNotch: Bool {
if #available(iOS 11.0, *) {
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}
Objetivo-C:
- (BOOL)hasTopNotch {
if (@available(iOS 11.0, *)) {
return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0;
}
return NO;
}
ACTUALIZACIÓN:
No utilice la propiedad userInterfaceIdiom
para identificar el tipo de dispositivo, como explica la documentación de userInterfaceIdiom:
En el caso de las aplicaciones universales, puedes utilizar esta propiedad para adaptar el comportamiento de tu aplicación a un tipo de dispositivo específico. Por ejemplo, los dispositivos iPhone y iPad tienen diferentes tamaños de pantalla, por lo que podría querer crear diferentes vistas y controles basados en el tipo de dispositivo actual.
Es decir, esta propiedad sólo se utiliza para identificar el estilo de vista de la aplicación en ejecución. Sin embargo, la aplicación iPhone (no la universal) podría ser instalada en el dispositivo iPad a través de la App store, en ese caso, el userInterfaceIdiom
devolverá el UIUserInterfaceIdiomPhone
, también.
La forma correcta es obtener el nombre de la máquina a través de uname
. Comprueba lo siguiente para más detalles:
Sí, es posible. Descargue la extensión UIDevice-Hardware (o instale a través de CocoaPod 'UIDevice-Hardware') y luego utilice:
NSString* modelID = [[[UIDevice currentDevice] modelIdentifier];
BOOL isIphoneX = [modelID isEqualToString:@"iPhone10,3"] || [modelID isEqualToString:@"iPhone10,6"];
Tenga en cuenta que esto no funcionará en el simulador, sólo en el dispositivo real.