Meine iOS-App verwendet eine benutzerdefinierte Höhe für die "UINavigationBar", die zu einigen Problemen auf dem neuen iPhone X führt.
Weiß jemand schon, wie man zuverlässig programmatisch (in Objective-C) erkennen kann, ob eine App auf dem iPhone X läuft?
EDIT:
Natürlich ist es möglich, die Größe des Bildschirms zu überprüfen, aber ich frage mich, ob es eine Methode wie "TARGET_OS_IPHONE" gibt, um iOS zu erkennen...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}
EDIT 2:
Ich denke nicht, dass meine Frage ein Duplikat der verlinkten Frage ist. Natürlich gibt es Methoden, um verschiedene Eigenschaften des aktuellen Geräts zu messen und die Ergebnisse zu verwenden, um zu entscheiden, welches Gerät verwendet wird. Dies war jedoch nicht der eigentliche Punkt meiner Frage, wie ich in meinem ersten Edit zu betonen versuchte.
Die eigentliche Frage lautet: "Ist es möglich, direkt zu erkennen, ob das aktuelle Gerät ein iPhone X ist (z. B. durch eine SDK-Funktion), oder muss ich indirekte Messungen verwenden"?
Nach den bisherigen Antworten gehe ich davon aus, dass die Antwort lautet: "Nein, es gibt keine direkten Methoden. Messungen sind der Weg zu gehen".
Ausgehend von Ihrer Frage lautet die Antwort: Nein. Es gibt keine direkten Methoden. Für weitere Informationen können Sie hier nachlesen:
und
Die Höhe des iPhone X beträgt 2436 px
Von [Device Screen Sizes and resolutions] (https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions):
Von Device Screen Sizes and Orientations:
Swift 3 und höher:
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")
}
}
Objektiv-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");
}
}
Basierend auf Ihrer Frage wie folgt:
Oder verwenden Sie screenSize.height
als float 812.0f
nicht 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");
}
Für weitere Informationen können Sie die folgende Seite in den iOS Human Interface Guidelines lesen:
Schnell:
Erkennen mit topNotch
:
Wenn jemand erwägt, die Kerbe zu verwenden, um iPhoneX zu erkennen, beachten Sie, dass auf "Landschaft" seine gleiche für alle iPhones.
var hasTopNotch: Bool {
if #available(iOS 11.0, *) {
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}
Objektiv-C:
- (BOOL)hasTopNotch {
if (@available(iOS 11.0, *)) {
return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0;
}
return NO;
}
UPDATE:
Verwenden Sie nicht die Eigenschaft "userInterfaceIdiom", um den Gerätetyp zu identifizieren, wie in der [Dokumentation für userInterfaceIdiom] (https://developer.apple.com/documentation/uikit/uidevice/1620037-userinterfaceidiom) erklärt wird:
Bei universellen Anwendungen können Sie diese Eigenschaft verwenden, um das Verhalten Ihrer Anwendung für einen bestimmten Gerätetyp anzupassen. Beispielsweise haben iPhone- und iPad-Geräte unterschiedliche Bildschirmgrößen, sodass Sie je nach Typ des aktuellen Geräts unterschiedliche Ansichten und Steuerelemente erstellen können.
Das heißt, diese Eigenschaft wird nur verwendet, um den Ansichtsstil der laufenden Anwendung zu identifizieren. Die iPhone-App (nicht die Universal-App) könnte jedoch über den App Store auf dem iPad-Gerät installiert werden. In diesem Fall gibt das userInterfaceIdiom
auch das UIUserInterfaceIdiomPhone
zurück.
Der richtige Weg ist, den Rechnernamen über uname
zu ermitteln. Im Folgenden finden Sie weitere Details:
Ja, das ist möglich. Laden Sie die UIDevice-Hardware-Erweiterung herunter (oder installieren Sie sie über CocoaPod 'UIDevice-Hardware') und verwenden Sie sie dann:
NSString* modelID = [[[UIDevice currentDevice] modelIdentifier];
BOOL isIphoneX = [modelID isEqualToString:@"iPhone10,3"] || [modelID isEqualToString:@"iPhone10,6"];
Beachten Sie, dass dies nicht im Simulator funktioniert, sondern nur auf dem tatsächlichen Gerät.
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0f)