检测设备是否为iPhone X
我的iOS应用程序使用UINavigationBar
的自定义高度,这会导致新的iPhone X出现一些问题。
如果某个应用程序在iPhone X上运行,是否有人已经知道如何以编程方式可靠地检测(在Objective-C中)?
编辑:
当然,检查屏幕的大小是可能的,但是,我想知道是否有像TARGET_OS_IPHONE
这样的“内置”方法来检测iOS ...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}
编辑2:
我不认为,我的问题是链接问题的重复。 当然,有些方法可以“测量”当前设备的不同属性,并使用结果来决定使用哪个设备。 但是,这并不是我的问题的实际问题,因为我在第一次编辑时试图强调这一点。
实际的问题是: “是否可以直接检测当前设备是否为iPhone X(例如通过某种SDK功能)还是必须使用间接测量” ?
根据迄今给出的答案,我假设答案是“不,没有直接的方法,测量是要走的路”。
根据你的问题,答案是否定的,没有直接的方法,更多的信息你可以从here1和here2获得信息
如果你想检测iPhone X的高度使用2436px
设备屏幕大小和方向
迅速3以上
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")
default:
print("unknown")
}
}
目标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:
printf("iPhone X");
break;
default:
printf("unknown");
}
}
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");
}
//etc...
}
基于你的问题如下
或者使用screenSize.height作为float 812.0f
而不是int 812
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812.0f)
NSLog(@"iPhone X");
}
欲了解更多信息,你可以在这里
UPDATE
不要使用userInterfaceIdiom
属性来标识设备类型,正如苹果文档解释的那样,
对于通用应用程序,您可以使用此属性来调整应用程序对特定类型设备的行为。 例如,iPhone和iPad设备具有不同的屏幕尺寸,因此您可能希望根据当前设备的类型创建不同的视图和控件。
也就是说,该属性仅用于识别正在运行的应用程序的视图样式。 但是,iPhone应用程序(不是通用的)可以通过App store安装在iPad设备上,在这种情况下,userInterfaceIdiom也会返回UIUserInterfaceIdiomPhone。
正确的方法是通过uname
获取机器名称,请查看该主题以了解详细信息。
另一种可能性,目前正在起作用,因为iPhone X是唯一一个在顶部有缺口的人。 这是我真正在这里检测到的:
BOOL iPhoneX = NO;
if (@available(iOS 11.0, *)) {
UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window];
if (mainWindow.safeAreaInsets.top > 0.0) {
iPhoneX = YES;
}
}
当然,如果您处于横向方向,则可能需要检查左侧和右侧安全区域的插页。
编辑:_window是AppDelegate的UIWindow,其中此检查在应用程序didFinishLaunchingWithOptions中完成。
您可以按照维度来检测iPhone X设备。
迅速
if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 {
//iPhone X
}
目标 - C
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone && UIScreen.mainScreen.nativeBounds.size.height == 2436) {
//iPhone X
}
但是 ,
这是不够的方式。 如果苹果公布下一款具有相同尺寸的iPhone X的iPhone,那么最好的方法是使用硬件字符串来检测设备。
对于较新的设备硬件字符串如下。
iPhone 8 - iPhone10,1或iPhone 10,4
iPhone 8 Plus - iPhone10,2或iPhone 10,5
iPhone X - iPhone10,3或iPhone10,6
链接地址: http://www.djcxy.com/p/19239.html上一篇: Detect if the device is iPhone X
下一篇: valueforkey when object property is readonly and Calculated(derived)