Mijn iOS app gebruikt een aangepaste hoogte voor de UINavigatieBalk
wat tot wat problemen leidt op de nieuwe iPhone X.
Weet iemand al hoe ik betrouwbaar programmatisch (in Objective-C) kan detecteren of een app op de iPhone X draait?
EDIT:
Natuurlijk is het controleren van de grootte van het scherm mogelijk, echter, ik vraag me af of er een of andere "build in" methode is zoals TARGET_OS_IPHONE
om iOS te detecteren...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}
EDIT 2:
Ik denk niet, dat mijn vraag een duplicaat is van de gelinkte vraag. Natuurlijk zijn er methoden om verschillende eigenschappen van het huidige apparaat te "meten" en om de resultaten te gebruiken om te beslissen welk apparaat wordt gebruikt. Dit was echter niet het eigenlijke punt van mijn vraag, zoals ik probeerde te benadrukken in mijn eerste bewerking.
De eigenlijke vraag is: "Is het mogelijk om direct te detecteren of het huidige apparaat een iPhone X is (bijv. door een of andere SDK-functie) of moet ik indirecte metingen gebruiken"?
Door de antwoorden die tot nu toe zijn gegeven, neem ik aan dat het antwoord is "Nee, er is geen directe methode. Metingen zijn de manier om te gaan".
Gebaseerd op uw vraag, is het antwoord nee. Er zijn geen directe methoden. Voor meer informatie kunt u hier terecht:
en
De hoogte van de iPhone X is 2436 px
Van Device Screen Sizes and resolutions:
Van Device Screen Sizes and Orientations:
Swift 3 en later:
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")
}
}
Objectief-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");
}
}
Gebaseerd op uw vraag als volgt:
Of gebruik screenSize.height
als float 812.0f
niet 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");
}
Voor meer informatie kunt u de volgende pagina in iOS Human Interface Guidelines raadplegen:
Swift:
Detecteer met topNotch
:
Als iemand overweegt om notch te gebruiken om iPhoneX te detecteren, denk eraan dat op "landscape" het hetzelfde is voor alle iPhones.
var hasTopNotch: Bool {
if #available(iOS 11.0, *) {
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}
Objectief-C:
- (BOOL)hasTopNotch {
if (@available(iOS 11.0, *)) {
return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0;
}
return NO;
}
UPDATE:
Gebruik de userInterfaceIdiom
eigenschap niet om het apparaattype te identificeren, zoals de documentatie voor userInterfaceIdiom uitlegt:
Voor universele applicaties kunt u deze eigenschap gebruiken om het gedrag van uw applicatie aan te passen voor een specifiek type apparaat. Bijvoorbeeld, iPhone en iPad apparaten hebben verschillende schermgroottes, dus u wilt misschien verschillende weergaven en besturingselementen maken op basis van het type van het huidige apparaat.
Dat wil zeggen, deze eigenschap wordt alleen gebruikt om de weergavestijl van de draaiende app's te identificeren. Echter, de iPhone app (niet de universele) zou kunnen worden geïnstalleerd in iPad-apparaat via App store, in dat geval zal de userInterfaceIdiom
ook de UIUserInterfaceIdiomPhone
retourneren.
De juiste manier is om de naam van de machine op te vragen via uname
. Bekijk het volgende voor details:
Ja, het is mogelijk. Download de UIDevice-Hardware extensie (of installeer via CocoaPod 'UIDevice-Hardware') en gebruik dan:
NSString* modelID = [[[UIDevice currentDevice] modelIdentifier];
BOOL isIphoneX = [modelID isEqualToString:@"iPhone10,3"] || [modelID isEqualToString:@"iPhone10,6"];
Merk op dat dit niet zal werken in de Simulator, alleen op het echte apparaat.