La mia app iOS usa un'altezza personalizzata per la UINavigationBar
che porta ad alcuni problemi sul nuovo iPhone X.
Qualcuno sa già come rilevare in modo affidabile programmaticamente (in Objective-C) se un'app è in esecuzione su iPhone X?
EDIT:
Naturalmente controllare la dimensione dello schermo è possibile, tuttavia, mi chiedo se c'è qualche "build in" metodo come TARGET_OS_IPHONE
per rilevare iOS...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}
EDIT 2:
Non credo che la mia domanda sia un duplicato della domanda collegata. Naturalmente, ci sono metodi per "misurare" diverse proprietà del dispositivo corrente e per usare i risultati per decidere quale dispositivo viene usato. Tuttavia, questo non era il punto effettivo della mia domanda, come ho cercato di sottolineare nella mia prima modifica.
La vera domanda è: "È possibile rilevare direttamente se il dispositivo corrente è un iPhone X (ad esempio da qualche funzione SDK) o devo usare misure indirette"?
Dalle risposte date finora, presumo che la risposta sia "No, non ci sono metodi diretti. Le misurazioni sono la strada da percorrere"**.
In base alla tua domanda, la risposta è no. Non ci sono metodi diretti. Per maggiori informazioni potete ottenere le informazioni qui:
e
L'altezza dell'iPhone X è di 2436 px
Da Dimensioni e risoluzioni dello schermo del dispositivo:
Da Dimensioni e orientamenti dello schermo del dispositivo:
Swift 3 e successivi:
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")
}
}
Obiettivo-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");
}
}
In base alla tua domanda come segue:
Oppure usa screenSize.height
come float 812.0f
non 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");
}
Per ulteriori informazioni potete fare riferimento alla seguente pagina nelle linee guida dell'interfaccia umana di iOS:
Swift:
Rileva con topNotch
:
Se qualcuno sta pensando di usare il notch per rilevare l'iPhoneX, tenga presente che su "paesaggio" è uguale per tutti gli iPhone.
var hasTopNotch: Bool {
if #available(iOS 11.0, *) {
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}
Obiettivo-C:
- (BOOL)hasTopNotch {
if (@available(iOS 11.0, *)) {
return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0;
}
return NO;
}
AGGIORNAMENTO:
Non usare la proprietà userInterfaceIdiom
per identificare il tipo di dispositivo, come spiega la documentazione per userInterfaceIdiom:
Per le applicazioni universali, potete usare questa proprietà per personalizzare il comportamento della vostra applicazione per un tipo specifico di dispositivo. Per esempio, i dispositivi iPhone e iPad hanno diverse dimensioni dello schermo, quindi potreste voler creare viste e controlli diversi in base al tipo di dispositivo corrente.
Cioè, questa proprietà è usata solo per identificare lo stile di visualizzazione dell'applicazione in esecuzione. Tuttavia, l'app iPhone (non quella universale) potrebbe essere installata nel dispositivo iPad tramite App store, in tal caso, la userInterfaceIdiom
restituirà anche la UIUserInterfaceIdiomPhone
.
Il modo giusto è ottenere il nome della macchina tramite uname
. Controlla quanto segue per i dettagli:
Sì, è possibile. Scarica l'estensione UIDevice-Hardware (o installala tramite CocoaPod 'UIDevice-Hardware') e poi usa:
NSString* modelID = [[[UIDevice currentDevice] modelIdentifier];
BOOL isIphoneX = [modelID isEqualToString:@"iPhone10,3"] || [modelID isEqualToString:@"iPhone10,6"];
Si noti che questo non funzionerà nel simulatore, solo sul dispositivo reale.