如何在iOS 8.3中检测设备是否为iPad?

时间:2015-04-13 15:01:32

标签: ios xcode ipad ios8.3

我们将SDK更新到iOS 8.3,突然之间,我们的iPad检测方法无法正常工作:

+ (BOOL) isiPad
{
#ifdef UI_USER_INTERFACE_IDIOM
    return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
#endif
    return NO;
}

永远不会输入ifdef块,因此始终会运行return NO;如何在不使用UI_USER_INTERFACE_IDIOM()的情况下检测设备是否为iPad?


我正在使用:

  • Xcode 6.3(6D570)
  • iOS 8.2(12D508) - 使用iOS 8.3编译器进行编译
  • 部署:目标设备系列:iPhone / iPad
  • Mac OS X:约塞米蒂(10.10.3)
  • Mac:MacBook Pro(MacBookPro11,3)

1 个答案:

答案 0 :(得分:12)

8.2 UserInterfaceIdiom()

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

8.3 UserInterfaceIdiom()

static inline UIUserInterfaceIdiom UI_USER_INTERFACE_IDIOM() {
    return ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ?
            [[UIDevice currentDevice] userInterfaceIdiom] :
            UIUserInterfaceIdiomPhone);
}

因此#ifdef UI_USER_INTERFACE_IDIOM

中的8.3始终为false

请注意标题是

  

提供UI_USER_INTERFACE_IDIOM()函数时使用   部署到小于3.2的iOS版本。如果最早的   您要部署的iPhone / iOS版本是3.2或   更大,您可以直接使用 - [UIDevice userInterfaceIdiom]。

所以建议你重构

+ (BOOL) isiPad
{
    static BOOL isIPad = NO;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        isIPad = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
    });
    return isIPad;
}