Reputation: 32103
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:
Upvotes: 7
Views: 5639
Reputation: 17382
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;
}
Upvotes: 13