Как обнаружить iPhone 5 (широкоэкранные устройства)?

Я только что обновился до XCode 4.5 GM и узнал, что теперь вы можете применить размер "4 Retina" к вашему контроллеру вида в раскадровке.

Теперь, если я хочу создать приложение, которое работает как на iPhone 4, так и на 5, конечно, мне нужно каждый раз создавать каждое окно, но я также должен определить, имеет ли пользователь iPhone с 3,5 "или 4" экраном и затем примените представление.

Как мне это сделать?

292
16 сент. '12 в 15:50
источник поделиться
24 ответов

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

Используйте возможности iOS с автоматическим изменением размера, поэтому ваши представления могут настраивать и изменять любой размер экрана.

Это не очень сложно, прочитайте некоторую документацию об этом. Это сэкономит вам много времени.

iOS 6 также предлагает новые функции об этом, но на данный момент он все еще находится под управлением NDA.
Обязательно прочитайте API-журнал изменений на веб-сайте Apple Developer, если вы можете получить к нему доступ.

Изменить. Поскольку iOS 6 теперь отсутствует, проверьте новые возможности AutoLayout.

Тем не менее, если вам действительно нужно обнаружить iPhone 5, вы можете просто полагаться на размер .

[ [ UIScreen mainScreen ] bounds ].size.height

Экран iPhone 5 имеет высоту 568.
Вы можете представить макрос, чтобы упростить все это:

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

Использование fabs с epsilon здесь для предотвращения ошибок точности при сравнении плавающих точек, как указано в комментариях H2CO3.

Итак, теперь вы можете использовать его в стандартных операторах if/else:

if( IS_IPHONE_5 )
{}
else
{}

Изменить - лучшее обнаружение

Как заявляют некоторые люди, это делает обнаружение широкоэкранного, а не реального iPhone 5.

В следующих версиях iPod touch также может быть такой экран, поэтому мы можем использовать другой набор макросов.

Переименуйте исходный макрос IS_WIDESCREEN:

#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

И добавьте макросы обнаружения модели:

#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD   ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )

Таким образом, мы можем гарантировать, что у нас есть модель iPhone И, и мы можем переопределить макрос IS_IPHONE_5:

#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )

Также обратите внимание, что, как указано в @LearnCocos2D, эти макросы не будут работать, если приложение не оптимизировано для экрана iPhone 5 (отсутствует изображение Default-568h@2x.png), так как размер экрана по-прежнему будет 320x480 в таком случае.

Я не думаю, что это может быть проблемой, поскольку я не понимаю, почему мы хотели бы обнаружить iPhone 5 в не оптимизированном приложении.

ВАЖНО - поддержка iOS 8

В iOS 8 свойство bounds класса UIScreen теперь отражает ориентацию устройства .
Очевидно, что предыдущий код не будет работать из коробки.

Чтобы исправить это, вы можете просто использовать новое свойство nativeBounds вместо bounds, так как оно не изменится с ориентацией и, поскольку оно основано на режиме портретной печати. ​​
Обратите внимание, что размеры nativeBounds измеряются в пикселях, поэтому для iPhone 5 высота будет 1136 вместо 568.

Если вы также настроите iOS 7 или ниже, обязательно используйте обнаружение функции, так как вызов nativeBounds до того, как iOS 8 приведет к сбою вашего приложения:

if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
    /* Detect using nativeBounds - iOS 8 and greater */
}
else
{
    /* Detect using bounds - iOS 7 and lower */
}

Вы можете адаптировать предыдущие макросы следующим образом:

#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN      ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )

И, очевидно, если вам нужно определить iPhone 6 или 6 Plus, используйте соответствующие размеры экрана.

Заключительная записка

Комментарии и предложения были включены в этот пост.
Спасибо всем.

464
16 сент. '12 в 16:08
источник

Связанные вопросы


Похожие вопросы

Протестировано и разработано для любой комбинации SDK и ОС:

Swift

Добавлены типы iPad. iPad 2 и iPad mini - это не-сетчатки iPads. В то время как iPad Mini 2 и выше, iPad 3, 4, iPad Air, Air 2, Air 3 и iPad Pro 9.7 имеют одинаковое логическое разрешение 1024. iPad Pro имеет максимальную длину 1366. Ссылка

import UIKit

public enum DisplayType {
    case unknown
    case iphone4
    case iphone5
    case iphone6
    case iphone6plus
    case iPadNonRetina
    case iPad
    case iPadProBig
    static let iphone7 = iphone6
    static let iphone7plus = iphone6plus
}

public final class Display {
    class var width:CGFloat { return UIScreen.main.bounds.size.width }
    class var height:CGFloat { return UIScreen.main.bounds.size.height }
    class var maxLength:CGFloat { return max(width, height) }
    class var minLength:CGFloat { return min(width, height) }
    class var zoomed:Bool { return UIScreen.main.nativeScale >= UIScreen.main.scale }
    class var retina:Bool { return UIScreen.main.scale >= 2.0 }
    class var phone:Bool { return UIDevice.current.userInterfaceIdiom == .phone }
    class var pad:Bool { return UIDevice.current.userInterfaceIdiom == .pad }
    class var carplay:Bool { return UIDevice.current.userInterfaceIdiom == .carPlay }
    class var tv:Bool { return UIDevice.current.userInterfaceIdiom == .tv }
    class var typeIsLike:DisplayType {
        if phone && maxLength < 568 {
            return .iphone4
        }
        else if phone && maxLength == 568 {
                return .iphone5
        }
        else if phone && maxLength == 667 {
            return .iphone6
        }
        else if phone && maxLength == 736 {
            return .iphone6plus
        }
        else if pad && !retina {
            return .iPadNonRetina
        }
        else if pad && retina && maxLength == 1024 {
            return .iPad
        }
        else if pad && maxLength == 1366 {
            return .iPadProBig
        }
        return .unknown
    }
}

Смотрите в действии https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346

Примечание: если, например, iPhone 6 находится в увеличенном режиме, UI - увеличенная версия iPhone 5. Эти функции не определяют тип устройства, но режим отображения, поэтому iPhone 5 является желаемым результатом в этом примере.

Objective-C

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_ZOOMED (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

Использование: http://pastie.org/9687735

Примечание: если, например, iPhone 6 находится в увеличенном режиме, пользовательский интерфейс представляет собой увеличенную версию iPhone 5. Эти функции не определяют тип устройства, но режим отображения, поэтому iPhone 5 является желаемым результатом в этом примере.

231
31 окт. '12 в 14:01
источник

Действительно простое решение

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    if(result.height == 568)
    {
        // iPhone 5
    }
}
69
25 сент. '12 в 20:20
источник

Теперь нам нужно учитывать размеры экрана iPhone 6 и 6Plus. Здесь обновленный ответ

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    //its iPhone. Find out which one?

    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    else if(result.height == 568)
    {
        // iPhone 5
    }
    else if(result.height == 667)
    {
        // iPhone 6
    }
   else if(result.height == 736)
    {
        // iPhone 6 Plus
    }
}
else
{
     //its iPad
}

Некоторая полезная информация

iPhone 6 Plus   736x414 points  2208x1242 pixels    3x scale    1920x1080 physical pixels   401 physical ppi    5.5"
iPhone 6        667x375 points  1334x750 pixels     2x scale    1334x750 physical pixels    326 physical ppi    4.7"
iPhone 5        568x320 points  1136x640 pixels     2x scale    1136x640 physical pixels    326 physical ppi    4.0"
iPhone 4        480x320 points  960x640 pixels      2x scale    960x640 physical pixels     326 physical ppi    3.5"
iPhone 3GS      480x320 points  480x320 pixels      1x scale    480x320 physical pixels     163 physical ppi    3.5"
26
24 сент. '14 в 16:07
источник

Я взял на себя смелость поместить макрос Macmade в функцию C и назвать его должным образом, потому что он обнаруживает широкоэкранную доступность и НЕ обязательно iPhone 5.

Макрос также не обнаруживает запуск на iPhone 5, если проект не включает Default-568h@2x.png. Без нового изображения по умолчанию iPhone 5 сообщит о стандартном размере экрана 480x320 (в точках). Таким образом, проверка не только для широкоэкранной доступности, но и для широкоэкранного режима.

BOOL isWidescreenEnabled()
{
    return (BOOL)(fabs((double)[UIScreen mainScreen].bounds.size.height - 
                                               (double)568) < DBL_EPSILON);
}
15
21 сент. '12 в 17:00
источник

Вот наши коды, тест прошел на ios7/ios8 для iphone4, iphone5, ipad, iphone6, iphone6p, независимо от устройств или симулятора:

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) // iPhone and       iPod touch style UI

#define IS_IPHONE_5_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
#define IS_IPHONE_6_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f)
#define IS_IPHONE_6P_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height < 568.0f)

#define IS_IPHONE_5_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 568.0f)
#define IS_IPHONE_6_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 667.0f)
#define IS_IPHONE_6P_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) < 568.0f)

#define IS_IPHONE_5 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_5_IOS8 : IS_IPHONE_5_IOS7 )
#define IS_IPHONE_6 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6_IOS8 : IS_IPHONE_6_IOS7 )
#define IS_IPHONE_6P ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6P_IOS8 : IS_IPHONE_6P_IOS7 )
#define IS_IPHONE_4_AND_OLDER ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_4_AND_OLDER_IOS8 : IS_IPHONE_4_AND_OLDER_IOS7 )
11
07 окт. '14 в 10:18
источник

Я использовал hfossli ответ и перевел его в Swift

let IS_IPAD = UIDevice.currentDevice().userInterfaceIdiom == .Pad
let IS_IPHONE = UIDevice.currentDevice().userInterfaceIdiom == .Phone
let IS_RETINA = UIScreen.mainScreen().scale >= 2.0

let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height
let SCREEN_MAX_LENGTH = max(SCREEN_WIDTH, SCREEN_HEIGHT)
let SCREEN_MIN_LENGTH = min(SCREEN_WIDTH, SCREEN_HEIGHT)

let IS_IPHONE_4_OR_LESS = (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
let IS_IPHONE_5 = (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
let IS_IPHONE_6 = (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
let IS_IPHONE_6P = (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
7
06 янв. '15 в 0:20
источник

Это макрос для моего проекта cocos2d. должны быть одинаковыми для других приложений.

#define WIDTH_IPAD 1024
#define WIDTH_IPHONE_5 568
#define WIDTH_IPHONE_4 480
#define HEIGHT_IPAD 768
#define HEIGHT_IPHONE 320

#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

//width is height!
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_5 )
#define IS_IPHONE_4 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_4 )

#define cp_ph4(__X__, __Y__) ccp(cx_ph4(__X__), cy_ph4(__Y__))
#define cx_ph4(__X__) (IS_IPAD ? (__X__ * WIDTH_IPAD / WIDTH_IPHONE_4) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPHONE_4) : (__X__)))
#define cy_ph4(__Y__) (IS_IPAD ? (__Y__ * HEIGHT_IPAD / HEIGHT_IPHONE) : (__Y__))

#define cp_pad(__X__, __Y__) ccp(cx_pad(__X__), cy_pad(__Y__))
#define cx_pad(__X__) (IS_IPAD ? (__X__) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPAD) : (__X__ * WIDTH_IPHONE_4 / WIDTH_IPAD)))
#define cy_pad(__Y__) (IS_IPAD ? (__Y__) : (__Y__ * HEIGHT_IPHONE / HEIGHT_IPAD))
6
29 сент. '12 в 7:32
источник
if ((int)[[UIScreen mainScreen] bounds].size.height == 568)
{
    // This is iPhone 5 screen
} else {
    // This is iPhone 4 screen
}
5
12 сент. '13 в 15:03
источник

В проекте Swift, iOS 8+ мне нравится делать расширение на UIScreen, например:

extension UIScreen {

    var isPhone4: Bool {
        return self.nativeBounds.size.height == 960;
    }

    var isPhone5: Bool {
        return self.nativeBounds.size.height == 1136;
    }

    var isPhone6: Bool {
        return self.nativeBounds.size.height == 1334;
    }

    var isPhone6Plus: Bool {
        return self.nativeBounds.size.height == 2208;
    }

}

(ПРИМЕЧАНИЕ: nativeBounds находится в пикселях).

И тогда код будет выглядеть следующим образом:

if UIScreen.mainScreen().isPhone4 {
    // do smth on the smallest screen
}

Таким образом, код дает понять, что это проверка для основного экрана, а не для модели устройства.

3
22 мая '16 в 18:37
источник
+(BOOL)isDeviceiPhone5
{
    BOOL iPhone5 = FALSE;

    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    if (screenBounds.size.height == 568)
    {
        // code for 4-inch screen
        iPhone5 = TRUE;
    }
    else
    {
        iPhone5 = FALSE;
        // code for 3.5-inch screen
    }
    return iPhone5;

}
2
19 мая '14 в 17:41
источник

Я обнаружил, что ответы не содержат специального случая для симуляторов.

#define IS_WIDESCREEN ( [ [ UIScreen mainScreen ] bounds ].size.height == 568  )
#define IS_IPHONE ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPhone"].location != NSNotFound)
#define IS_IPAD ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPad"].location != NSNotFound)
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
2
08 нояб. '13 в 0:39
источник

Я думаю, что должно быть хорошо, если этот макрос будет работать в устройстве и симуляторе, ниже это решение.

#define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
#define IS_IPHONE (([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"]) || ([[[UIDevice currentDevice] model] isEqualToString: @"iPhone Simulator"]))
#define IS_IPOD   ([[[UIDevice currentDevice]model] isEqualToString:@"iPod touch"])
#define IS_IPHONE_5 ((IS_IPHONE || IS_IPOD) && IS_WIDESCREEN)
2
08 февр. '13 в 13:38
источник

Заимствование от Samrat Mazumdar ответьте, здесь короткий метод, который оценивает размер экрана устройства. Он работает с последними устройствами, но может не работать в будущем (как и все методы угадывания). Он также путается, если устройство зеркалируется (возвращает размер экрана устройства, а не зеркальный размер экрана)

#define SCREEN_SIZE_IPHONE_CLASSIC 3.5
#define SCREEN_SIZE_IPHONE_TALL 4.0
#define SCREEN_SIZE_IPAD_CLASSIC 9.7

+ (CGFloat)screenPhysicalSize
{
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        if (result.height < 500)
            return SCREEN_SIZE_IPHONE_CLASSIC;  // iPhone 4S / 4th Gen iPod Touch or earlier
        else
            return SCREEN_SIZE_IPHONE_TALL;  // iPhone 5
    }
    else
    {
        return SCREEN_SIZE_IPAD_CLASSIC; // iPad
    }
} 
2
11 окт. '12 в 2:25
источник

Опора в размере неверна на многих уровнях. Как насчет того, чтобы мы просили систему?

- (NSString *) getDeviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

Взято из Лучший способ определить тип аппаратного обеспечения, iPhone4 или iPhone5?, ответ edzio27.

1
01 марта '13 в 2:03
источник

На это ответили сто раз, но это решение работало лучше всего для меня. Это простая вспомогательная функция и не требует расширения системного класса.

Свифт 3 Помощник:

func phoneSizeInInches(defaultValue: Float = 4.7) -> Float {
    switch (UIScreen.main.nativeBounds.size.height) {
    case 960, 480:
        return 3.5
    case 1136:
        return 4
    case 1334:
        return 4.7
    case 2208:
        return 5.5
    default:
        return defaultValue
    }
}

Это связано с тем, что легко запоминать размеры телефона в дюймах, например, "5,5-дюймовый" или "4,7-дюймовый", но трудно запоминать точные размеры пикселей.

if phoneSizeInInches() == 4 {
  //do something with only 4 inch iPhones
}

Это также дает вам возможность сделать что-то вроде этого:

if phoneSizeInInches() < 5.5 {
  //do something all iPhones smaller than the plus
}

"defaultValue" гарантирует, что ваш код всегда будет защищен до безопасного размера, если Apple выпустит новый размер устройства, и вы еще не обновили приложение.

if phoneSizeInInches(defaultValue: 4.7) == 4 {
    //if a new iPhone size is introduced, your code will default to behaving like a 4.7 inch iPhone
}

Обратите внимание, что это специфично для телефонных приложений, для некоторых универсальных изменений потребуются некоторые изменения.

1
03 нояб. '16 в 6:06
источник

Таким образом вы можете обнаружить семейство устройств.

    #import <sys/utsname.h>
    NSString* deviceName()
    {
        struct utsname systemInformation;
        uname(&systemInformation);
        NSString *result = [NSString stringWithCString:systemInformation.machine
                                              encoding:NSUTF8StringEncoding];
        return result;
    }

    #define isIPhone5  [deviceName() rangeOfString:@"iPhone5,"].location != NSNotFound
    #define isIPhone5S [deviceName() rangeOfString:@"iPhone6,"].location != NSNotFound
1
10 апр. '14 в 10:17
источник
CGFloat height = [UIScreen mainScreen].bounds.size.height;

NSLog(@"screen soze is %f",height);

  if (height>550) {

          // 4" screen-do some thing
     }

  else if (height<500) {

        // 3.5 " screen- do some thing

     }
1
11 дек. '12 в 8:39
источник

В Swift 3 вы можете использовать мой простой класс KRDeviceType.

https://github.com/ulian-onua/KRDeviceType

Он хорошо документирован и поддерживает операторы ==, > =, < =.

Например, чтобы определить, имеет ли устройство ограничения iPhone 6/6s/7, вы можете просто использовать следующее сравнение:

if KRDeviceType() == .iPhone6 {
// Perform appropiate operations
}

Чтобы определить, имеет ли устройство ограничения iPhone 5/5S/SE или ранее (iPhone 4s), вы можете использовать следующее сравнение:

if KRDeviceType() <= .iPhone5 {   //iPhone 5/5s/SE of iPhone 4s
// Perform appropiate operations (for example, set up constraints for those old devices)
}
1
09 апр. '17 в 12:48
источник

Если проект создан с использованием Xcode 6, используйте нижеприведенный код для обнаружения устройств.

printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
    {
        if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
            printf("Device Type : iPhone 4,4s ");

        }else if([[UIScreen mainScreen] nativeBounds].size.height == 1136){
            printf("Device Type : iPhone 5,5S/iPod 5 ");

        }else if([[UIScreen mainScreen] nativeBounds].size.height == 1334){
            printf("Device Type : iPhone 6 ");

        }else if([[UIScreen mainScreen] nativeBounds].size.height == 2208){
            printf("Device Type : iPhone 6+ ");

        }
    }
}else{
    printf("Device Type : iPad");
}

Если проект был создан в Xcode 5 и открыт в Xcode 6, используйте нижеприведенный код для обнаружения устройств. (Этот код работает, если не назначены стартовые изображения для iPhone 6,6+)

printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
    {
       if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
            printf("Device Type : iPhone 4,4s");
            appType=1;
        }else if([[UIScreen mainScreen] nativeBounds].size.height == 1136 || [[UIScreen mainScreen] nativeBounds].size.height == 1704){
            printf("Device Type : iPhone 5,5S,6,6S/iPod 5 ");
            appType=3;
        }
    }
}else{
    printf("Device Type : iPad");
    appType=2;
}

Если вы все еще используете Xcode 5 вместе, используйте следующий код для обнаружения устройств (iPhone 6 и 6+ не будут обнаружены)

printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] bounds].size.width,(int)[[UIScreen mainScreen] bounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        CGFloat scale = [UIScreen mainScreen].scale;
        result = CGSizeMake(result.width * scale, result.height * scale);
        if(result.height == 960 || result.height == 480){
            printf("Device Type : iPhone 4,4S ");

        }else if(result.height == 1136){
            printf("Device Type : iPhone 5s/iPod 5");

        }
    }
}else{
    printf("Device Type : iPad");

}
1
28 сент. '14 в 20:24
источник
  • Добавить "Новый быстрый файл" → AppDelegateEx.swift

  • добавьте расширение AppDelegate

    import UIKit
    extension AppDelegate {
         class func isIPhone5 () -> Bool{
             return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 568.0
        }
        class func isIPhone6 () -> Bool {
            return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 667.0
        }
        class func isIPhone6Plus () -> Bool {
            return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 736.0
        }  
    }
    
  • Использование:

        if AppDelegate.isIPhone5() {
            collectionViewTopConstraint.constant = 2
        }else if AppDelegate.isIPhone6() {
            collectionViewTopConstraint.constant = 20
        }
    
1
27 окт. '15 в 5:13
источник

Вот правильный тест устройства, не зависящий от ориентации

- (BOOL)isIPhone5
{
    CGSize size = [[UIScreen mainScreen] bounds].size;
    if (MIN(size.width,size.height) == 320 && MAX(size.width,size.height == 568)) {
        return YES;
    }
    return NO;
}
0
13 апр. '16 в 15:58
источник

используйте следующий код:

CGFloat screenScale = [[UIScreen mainScreen] scale];

CGRect screenBounds = [[UIScreen mainScreen] bounds]; 

CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 

if (screenSize.height==1136.000000)
{ 
    // Here iPhone 5 View

    // Eg: Nextview~iPhone5.Xib
} else {
   // Previous Phones 

   // Eg : Nextview.xib
}
0
10 окт. '12 в 10:18
источник

Используется для обнаружения устройств iPhone и iPad всех версий.

#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_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0) 
-2
24 сент. '14 в 17:58
источник

Посмотрите другие вопросы по меткам или Задайте вопрос