【问题标题】:Detect iPhone X with a macro [duplicate]使用宏检测 iPhone X [重复]
【发布时间】:2018-02-22 03:08:44
【问题描述】:

如何检测 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 为真。这个宏正确吗?

【问题讨论】:

  • “我如何检测特定设备”的答案长期以来一直是“不要;询问您需要的功能,而不是设备”。您可能确实对此有正当需求,但请仔细考虑。
  • 我使用:#define IS_IPHONEX (IS_IPHONE_PORTRAIT_SIZE_CLASS([UIScreen mainScreen].traitCollection) && [[UIScreen mainScreen] bounds].size.height == 812.0)
  • 使用 UIScreen.mainScreen.fixedCoordinateSpace.bounds.size.height == 812.0 无需担心设备方向。

标签: ios objective-c cocoa-touch


【解决方案1】:

据我所知,最后一行应该让您感到困惑。但你是对的

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

因为 iPhone X 在纵向模式下的高度是 2436px(812pts) 而在横向模式下的宽度是 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

【讨论】:

    【解决方案2】:

    根据 Apple Human Interface Guidelines,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 有height of 812,比 iPhone 6/7/8 多出 20%
    • 这将是横向模式的正确宏吗?我不这么认为
    • 不,它仅适用于纵向模式! @AdityaSrivastava
    • @AdityaSrivastava 你可以试试#define IS_IPHONE_X (MAX(CGRectGetWidth([[UIScreen mainScreen] bounds]), CGRectGetHeight([[UIScreen mainScreen] bounds])) == 812),我猜它适用于横向和纵向
    • 是的,如果我们想检查两种模式,我们可以这样做! @PratikJamariya
    【解决方案3】:

    嘿嘿,

    希望对您有所帮助。

    目标 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)
    

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

    斯威夫特

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2012-09-14
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      相关资源
      最近更新 更多