O meu aplicativo iOS utiliza uma altura personalizada para a UINavigationBar
o que leva a alguns problemas no novo iPhone X.
Alguém já sabe como confiar detectar programmaticamente (no Objective-C) se um aplicativo está rodando no iPhone X?
EDIT:
Claro que é possível verificar o tamanho da tela, no entanto, eu me pergunto se existe algum "build in" método como TARGET_OS_IPHONE
para detectar o iOS...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}
EDIT 2:
Eu não acho que a minha pergunta seja uma duplicata da pergunta ligada. Claro que existem métodos para "measure" diferentes propriedades do dispositivo atual e para usar os resultados para decidir qual dispositivo é usado. No entanto, este não foi o verdadeiro ponto da minha pergunta, como tentei enfatizar na minha primeira edição.
A verdadeira questão é: "É possível detectar directamente se o dispositivo actual é um iPhone X (por exemplo, por alguma funcionalidade do SDK) ou tenho de utilizar medições indirectas"?
Pelas respostas dadas até agora, assumo que a resposta é "Não, não há métodos directos. As medidas são o caminho a seguir".
Com base na sua pergunta, a resposta é não. Não há métodos directos. Para mais informações, você pode obter as informações aqui:
e
A altura do iPhone X é de 2436 px
De Tamanhos e Resoluções da Tela do Dispositivo:
De Tamanhos de Tela e Orientações do Dispositivo:
**Swift 3 e mais tarde***:
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")
}
}
**Objectivo-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");
}
}
Com base na sua pergunta, como se segue:
Ou utilize screenSize.height
como float 812.0f
e não 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 mais informações, você pode consultar a seguinte página nas Diretrizes da Interface Humana iOS:
**"Swift":
Detectar com topNotch
:
Se alguém estiver considerando usar o notch para detectar o iPhoneX, lembre-se que no " landscape" é o mesmo para todos os iPhones.
var hasTopNotch: Bool {
if #available(iOS 11.0, *) {
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}
**Objectivo-C***:
- (BOOL)hasTopNotch {
if (@available(iOS 11.0, *)) {
return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0;
}
return NO;
}
**UPDATE***:
Não utilize a propriedade `userInterfaceIdiom' para identificar o tipo de dispositivo, como explica a documentação para userInterfaceIdiom:
Para aplicações universais, você pode usar esta propriedade para adaptar o comportamento da sua aplicação para um tipo específico de dispositivo. Por exemplo, os dispositivos iPhone e iPad têm telas de diferentes tamanhos, então você pode querer criar visões e controles diferentes com base no tipo do dispositivo atual.
Ou seja, esta propriedade é apenas usada para identificar o estilo de visualização do app's running. Entretanto, o aplicativo iPhone (não o universal) pode ser instalado no dispositivo iPad via App store, nesse caso, o userInterfaceIdiom' irá retornar o
UIUserInterfaceIdiomPhone', também.
A maneira certa é obter o nome da máquina através de "uname". Verifique o seguinte para mais detalhes:
Sim, é possível. Baixe a extensão UIDevice-Hardware (ou instale via CocoaPod ' UIDevice-Hardware') e depois use:
NSString* modelID = [[[UIDevice currentDevice] modelIdentifier];
BOOL isIphoneX = [modelID isEqualToString:@"iPhone10,3"] || [modelID isEqualToString:@"iPhone10,6"];
Note que este won't funciona no Simulador, apenas no dispositivo real.