34

How can I detect whether a user has an iPhone 6 Plus in standard or zoomed mode? Is this possible?

I've tried [UIScreen mainScreen].scale and it reports 3.0 in both cases.

6 Answers 6

18

WORKING SOLUTION:

//Display Zoom mode var isZoomed: Bool { return UIScreen.main.scale < UIScreen.main.nativeScale } 

OLD SOLUTION (not reliable in some edge case):

var isZoomed: Bool { return UIScreen.main.scale != UIScreen.main.nativeScale }

P.S: Please do not confuse these features from the iPhone settings:

  1. Settings -> Display & Brightness -> Display Zoom

with:

  1. Settings -> Accessibility -> Zoom.

Here we check for the first type.

Sign up to request clarification or add additional context in comments.

8 Comments

It doesn't work, unfortunately. 12 mini zoomed: scale 3.0, nativeScale 3.515625 ✅ 12 mini no zoom: scale 3.0, nativeScale 3.0 ✅ SE 1st gen zoomed: scale 2.0, nativeScale 2.0 ❌ SE 1st gen no zoom: scale 2.0, nativeScale 1.7066666666666668❌
@DarekCieśla that is a nice find. I didn't test absolutely all devices. I think this might be a bug with iPhones SE 1st gen, since all the other devices which I tested on, worked perfectly fine.
I just tested this on all available simulators in xcode 12 (including SE 2nd Gen) and returned correct results on all. I didn't test it on SE 1st Gen since it doesn't support iOS 14.
@Fouad SE1 does support iOS14 [...]. The comparison above returns false for SE1 because it is the only device that does not support Zoomed Mode, and thus its scale vs nativeScale is always the same. That being said, the code if safe to use on all devices, thanks @Starsky!
No! Simulators return different value with devices!
|
14

There's a new member

[[UIScreen mainScreen] nativeScale] 

which should do what you want. It's only available on iOS 8, so you'll need to guard it

1 Comment

This worked for me! Just had to add mainScreen(). "UIScreen.mainScreen().nativeScale". Very useful to get images from a web service by their width & height and into an image view :D
13

[UIScreen mainScreen].currentMode reports:

<UIScreenMode: 0x17802f240; size = 1242.000000 x 2208.000000> // STANDARD <UIScreenMode: 0x178226be0; size = 1125.000000 x 2001.000000> // ZOOMED 

Comments

10

The following code may be used to get bounds, coordinateSpace, nativeScale and scale, i.e. on an iPhone 6 Plus the nativeScale is 2.608 and when the device in run in Zoomed Mode it is 2.88 (note that it is different in the simulator):

UIScreen *mainScreen = [UIScreen mainScreen]; NSLog(@"Screen bounds: %@, Screen resolution: %@, scale: %f, nativeScale: %f", NSStringFromCGRect(mainScreen.bounds), mainScreen.coordinateSpace, mainScreen.scale, mainScreen.nativeScale); 

Code for detecting iPhone 6 Plus:

-(BOOL)iPhone6PlusDevice{ // Scale is 3 currently only for iPhone 6 Plus if ([UIScreen mainScreen].scale > 2.9) return YES; return NO; } 

or

 -(BOOL)iPhone6PlusUnZoomed{ if ([self iPhone6PlusDevice]){ if ([UIScreen mainScreen].bounds.size.height > 720.0) return YES; // Height is 736, but 667 when zoomed. } return NO; } 

Note: If you are checking for iPhone 6 Plus, to adjust the user interface then don´t rely on .nativeScale, because the simulator and an actual device give different results.

4 Comments

I'm running my extension in the new Messages app which has been properly updated for the new screen sizes in iOS8 (e.g. one that is not 'zoomed'), and screenScale: 3.000000, and nativeScale: 2.608696
@barfoon what were the screen resolutions reported? As I live in a country without Apple store, I haven´t been able to buy the new iPhone 6 Plus.
nativeScale isn't to do with whether or not the app is being run in scaled mode: stackoverflow.com/questions/25871858/…
@HHHH Your right and I have updated the text to reflect that although the code is still valid.
7

Updated macros from Paula Chavarría's answer for iOS 8 (where [UIScreen mainScreen].bounds.size is orientation dependent):

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPHONE_5 (IS_IPHONE && (MAX([[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width) == 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 && MAX([[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width) == 667.0 && IS_OS_8_OR_LATER && [UIScreen mainScreen].nativeScale == [UIScreen mainScreen].scale) #define IS_ZOOMED_IPHONE_6 (IS_IPHONE && MAX([[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width) == 568.0 && IS_OS_8_OR_LATER && [UIScreen mainScreen].nativeScale > [UIScreen mainScreen].scale) #define IS_STANDARD_IPHONE_6_PLUS (IS_IPHONE && MAX([[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width) == 736.0) #define IS_ZOOMED_IPHONE_6_PLUS (IS_IPHONE && MAX([[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width) == 667.0 && IS_OS_8_OR_LATER && [UIScreen mainScreen].nativeScale < [UIScreen mainScreen].scale) #define IS_IPHONE_6 (IS_STANDARD_IPHONE_6 || IS_ZOOMED_IPHONE_6) #define IS_IPHONE_6_PLUS (IS_STANDARD_IPHONE_6_PLUS || IS_ZOOMED_IPHONE_6_PLUS) 

Comments

5

These option is used to detect iPhone Devices.

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0) #define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0) #define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f) #define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0) #define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0) 

1 Comment

Since iOS 8 [UIScreen mainScreen].bounds.size became orientation dependent and these macros are broken in landscape mode. Could be fixed by using MAX(width, height) for value comparisons. Please see my answer below.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.