iosxcodeipadios8.3

How can I detect if device is an iPad in iOS 8.3?


We updated our SDK to iOS 8.3, and all of a sudden, our iPad detection method doesn't work properly:

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

the ifdef block is never entered, and so return NO; is always run. How do I detect if the device is an iPad without using UI_USER_INTERFACE_IDIOM()?


I'm using:


Solution

  • In 8.2 UserInterfaceIdiom() is

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

    In 8.3 UserInterfaceIdiom() is

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

    So #ifdef UI_USER_INTERFACE_IDIOM is always false in 8.3

    Note that the header says

    The UI_USER_INTERFACE_IDIOM() function is provided for use when deploying to a version of the iOS less than 3.2. If the earliest version of iPhone/iOS that you will be deploying for is 3.2 or greater, you may use -[UIDevice userInterfaceIdiom] directly.

    So suggest you refactor to

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