我的 iOS 应用程序使用自定义高度,UINavigationBar这会导致新 iPhone X 出现一些问题。
UINavigationBar
如果应用程序在 iPhone X 上运行,是否有人已经知道如何以编程方式(在 Objective-C 中) 可靠地检测?
编辑:
当然可以检查屏幕的大小,但是,我想知道是否有一些“内置”方法,比如TARGET_OS_IPHONE检测 iOS ......
TARGET_OS_IPHONE
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize screenSize = [[UIScreen mainScreen] bounds].size; if (screenSize.height == 812) NSLog(@"iPhone X"); }
编辑2:
我不认为,我的问题是链接问题的重复。当然,有一些方法可以“测量”当前设备的不同属性,并使用结果来决定使用哪个设备。但是,这不是我的问题的实际意义,因为我在第一次编辑中试图强调。
实际问题是: “是否可以直接检测当前设备是否为 iPhone X(例如通过某些 SDK 功能),还是我必须使用间接测量” ?
根据到目前为止给出的答案,我认为答案是“不,没有直接的方法。测量是要走的路”。
iPhone X 高度为 2436 像素
从设备屏幕尺寸和分辨率:
从设备屏幕尺寸和方向:
Swift 3 and 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") } }
Objective-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: case 2208: printf("iPhone 6+/6S+/7+/8+"); break; case 2436: printf("iPhone X/XS/11 Pro"); break; case 2688: printf("iPhone XS Max/11 Pro Max"); break; case 1792: printf("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"); } }
根据您的问题如下:
或screenSize.height用作 float812.0f 而不是 int 812。
screenSize.height
812.0f
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"); }
有关更多信息,您可以参考 iOS 人机界面指南中的以下页面:
Swift :
检测topNotch:
topNotch
如果有人考虑使用 notch 来检测 iPhoneX,请注意在“风景”上对所有 iPhone 都是一样的。
var hasTopNotch: Bool { if #available(iOS 13.0, *) { return UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.safeAreaInsets.top ?? 0 > 20 }else{ return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20 } return false }
- (BOOL)hasTopNotch { if (@available(iOS 13.0, *)) { return [self keyWindow].safeAreaInsets.top > 20.0; }else{ return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0; } return NO; } - (UIWindow*)keyWindow { UIWindow *foundWindow = nil; NSArray *windows = [[UIApplication sharedApplication]windows]; for (UIWindow *window in windows) { if (window.isKeyWindow) { foundWindow = window; break; } } return foundWindow; }
更新 :
不要使用该userInterfaceIdiom属性来识别设备类型,正如userInterfaceIdiom 的文档所解释的那样:
userInterfaceIdiom
对于通用应用程序,您可以使用此属性为特定类型的设备定制应用程序的行为。例如,iPhone 和 iPad 设备具有不同的屏幕尺寸,因此您可能希望根据当前设备的类型创建不同的视图和控件。
也就是说,这个属性只是用来标识正在运行的应用程序的视图样式。但是,iPhone 应用程序(不是通用的)可以通过 App Store 安装在 iPad 设备上,在这种情况下,userInterfaceIdiom也会返回UIUserInterfaceIdiomPhone.
UIUserInterfaceIdiomPhone
正确的方法是通过uname. 检查以下内容以了解详细信息:
uname