使用宏检测iPhone X

6
我该如何检测是否在iPhone X上运行?我尝试了以下代码。
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)

当我在iOS模拟器中运行此宏时,IS_IPHONE_X为真。这个宏是正确的吗?

2
“如何检测特定设备”的答案很久以来一直是“不要;问你需要的能力,而不是设备”。你可能确实有这方面的合法需求,但请仔细考虑。 - jscs
我使用: #define IS_IPHONEX(IS_IPHONE_PORTRAIT_SIZE_CLASS([UIScreen mainScreen] .traitCollection)&& [[UIScreen mainScreen] bounds] .size.height == 812.0) - Vlad
使用UIScreen.mainScreen.fixedCoordinateSpace.bounds.size.height == 812.0,无需担心设备方向。 - Cheng Zheng
请看这里 https://dev59.com/h1YO5IYBdhLWcg3wMO1y#52821290 - ale_stro
3个回答

5
根据苹果公司的人机界面指南,iPhone X的屏幕宽度为375,屏幕高度为812,因此我认为这是正确的!您可以编写类似于宏的东西,例如:
 #define IS_IPHONE4 (([[UIScreen mainScreen] bounds].size.height-480)?NO:YES)

 #define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)

#define IS_IPHONE6 (([[UIScreen mainScreen] bounds].size.height-667)?NO:YES)

#define IS_IPHONE6P (([[UIScreen mainScreen] bounds].size.height-736)?NO:YES)

 #define IS_IPHONEX (([[UIScreen mainScreen] bounds].size.height-812)?NO:YES)

没错,@Lion,iPhone X的高度为812(https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/),比iPhone 6/7/8多20%。 - Pratik Jamariya
2
这个宏定义是否适用于横向模式?我认为不是。 - Aditya Srivastava
不,它只适用于纵向模式!@AdityaSrivastava - Ketan Parmar
@AdityaSrivastava 你可以尝试这样写 #define IS_IPHONE_X (MAX(CGRectGetWidth([[UIScreen mainScreen] bounds]), CGRectGetHeight([[UIScreen mainScreen] bounds])) == 812),我猜它可以在横屏和竖屏下都起作用。 - Pratik Jamariya
是的,我们可以这样做,如果我们想检查两种模式!@PratikJamariya - Ketan Parmar
#define IS_IPHONEX ((fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)812) < DBL_EPSILON) || (fabs((double)[[UIScreen mainScreen] bounds].size.width - (double)812) < DBL_EPSILON)) - Levi

1

据我所知,最后一行可能让您感到困惑。但是您是正确的。

#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)

由于iPhone X竖屏模式下的高度为2436像素(812个点),横屏模式下的宽度也是2436像素(812个点)。

正如Lion所建议的,以下代码适用于两种模式。您只需要更改宏的最后一行即可。

    #define IS_IPHONE_4 (IS_IPHONE && SCREEN_MAX_LENGTH == 480.0)
//iphone 4
    #define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
//iphone 5
    #define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
//iphone 6
    #define IS_IPHONE_6p (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
//iphone6p
    #define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)
//iphone x

0

你好,

希望这能帮到你。

Objective C

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4S (IS_IPHONE && ([[UIScreen mainScreen] bounds].size.height == 480.0) && ((IS_OS_8_OR_LATER && [UIScreen mainScreen].nativeScale == [UIScreen mainScreen].scale) || !IS_OS_8_OR_LATER))
#define IS_IPHONE_5 (IS_IPHONE && ([[UIScreen mainScreen] bounds].size.height == 568.0) && ((IS_OS_8_OR_LATER && [UIScreen mainScreen].nativeScale == [UIScreen mainScreen].scale) || !IS_OS_8_OR_LATER))
#define   IS_STANDARD_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0  && IS_OS_8_OR_LATER && [UIScreen mainScreen].nativeScale == [UIScreen mainScreen].scale)
#define IS_ZOOMED_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0 && IS_OS_8_OR_LATER && [UIScreen mainScreen].nativeScale > [UIScreen mainScreen].scale)
#define IS_STANDARD_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_ZOOMED_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0 && IS_OS_8_OR_LATER && [UIScreen mainScreen].nativeScale < [UIScreen mainScreen].scale)

你可以在上面的列表中添加更多内容

Swift

let IS_IPAD = (UI_USER_INTERFACE_IDIOM() == .pad)
let IS_IPHONE = (UI_USER_INTERFACE_IDIOM() == .phone)
let IS_IPHONE_4S = (IS_IPHONE && (UIScreen.main.bounds.size.height == 480.0) && ((IS_OS_8_OR_LATER && UIScreen.main.nativeScale == UIScreen.main.scale) || !IS_OS_8_OR_LATER))
let IS_IPHONE_5 = (IS_IPHONE && (UIScreen.main.bounds.size.height == 568.0) && ((IS_OS_8_OR_LATER && UIScreen.main.nativeScale == UIScreen.main.scale) || !IS_OS_8_OR_LATER))
let IS_STANDARD_IPHONE_6 = (IS_IPHONE && UIScreen.main.bounds.size.height == 667.0 && IS_OS_8_OR_LATER && UIScreen.main.nativeScale == UIScreen.main.scale)
let IS_ZOOMED_IPHONE_6 = (IS_IPHONE && UIScreen.main.bounds.size.height == 568.0 && IS_OS_8_OR_LATER && UIScreen.main.nativeScale > UIScreen.main.scale)
let IS_STANDARD_IPHONE_6_PLUS = (IS_IPHONE && UIScreen.main.bounds.size.height == 736.0)

使用这个宏的方式如下:

if (IS_IPAD) {
        // your code hear
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接