2014-09-20 7 views

ответ

7

[UIScreen mainScreen].currentMode отчеты:

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

Там новый член

[[UIScreen mainScreen] nativeScale] 

, которые должны делать то, что вы хотите. Он доступен только на прошивке 8, так что вам нужно, чтобы охранять его

+1

Это работает для меня! Просто нужно было добавить mainScreen(). "UIScreen.mainScreen(). NativeScale". Очень полезно получать изображения из веб-службы по их ширине и высоте и в виде изображения: D – nmdias

11

Следующий код может быть использован для получения bounds, coordinateSpace, nativeScale и scale, то есть на iPhone 6 Плюса nativeScale является 2,608 и когда устройство в работать в режиме Zoomed это 2,88 (заметим, что она отличается в тренажере):

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

Код для обнаружения iPhone 6 Plus:

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

или

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

Примечание: Если вы проверяете для iPhone 6 Plus, чтобы настроить пользовательский интерфейс, то don't полагаться на .nativeScale, потому что симулятор и фактическое устройство дают разные результаты.

+2

Я запускаю расширение в новом приложении «Сообщения», которое было правильно обновлено для новых размеров экрана в iOS8 (например, а не 'zoomed') и 'screenScale: 3.000000' и' nativeScale: 2.608696' – barfoon

+0

@barfoon, о чем сообщалось разрешение экрана? Поскольку я живу в стране без магазина Apple, я не смог купить новый iPhone 6 Plus. –

+0

nativeScale не зависит от того, выполняется ли приложение в масштабированном режиме: http://stackoverflow.com/questions/25871858/what-is-the-difference-between-nativescale-and-scale-on- uiscreen-in-ios8 – HHHH

5

Эти параметры используются для обнаружения устройств iPhone.

#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) 
+0

Поскольку iOS 8 '[UIScreen mainScreen] .bounds.size' стал зависимым от ориентации, и эти макросы разбиты в ландшафтном режиме. Могут быть исправлены с использованием MAX (ширина, высота) для сравнения значений. См. Мой ответ ниже. – xZenon

5

Обновленные макросы из Paula Chavarría-х answer для прошивки 8 (где [UIScreen mainScreen].bounds.size зависит ориентация):

#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)