Подтвердить что ты не робот

Обнаружение устройства iPad Pro

Я пытаюсь обнаружить устройство iPad Pro, пытаясь угадать его высоту с помощью:

NSLog(@"%f",self.view.frame.size.height);

Но он возвращает 1024! такие же, как iPad не сетчатые устройства. любые советы?

Мне нужно указать некоторые коды для iPad Pro с этой строкой кода:

#define iPadPro ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && [UIScreen mainScreen].bounds.size.height == 2732)

... и коды должны обнаруживать iPad Pro даже на симуляторе iOS!

Спасибо

ИЗМЕНИТЬ: Некоторые предлагают использовать LunchScreen, но когда я его использую, это происходит (уменьшено): введите описание изображения здесь

4b9b3361

Ответ 1

Особая благодарность @rmaddy

Правильный способ определения размеров экранов:

NSLog(@"%f",[UIScreen mainScreen].bounds.size.height);

Теперь, если ваше приложение работает в режиме Portrait, вы можете просто использовать этот код для обнаружения iPad Pro:

#define iPadPro ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && [UIScreen mainScreen].bounds.size.height == 1366)

Не забывайте, что использование LaunchScreen или приложения не будет использовать расширенный экран iPad Pro.

Ответ 2

обнаруживает iPad про 12,9 дюйма независимо от ориентации устройства

#define iPadPro12 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad && UIScreen.mainScreen.nativeBounds.size.height == 2732) 

Ответ 3

Вот проверка, которая будет работать независимо от ориентации устройства:

- (BOOL)isIpadPro
{
    UIScreen *mainScreen = [UIScreen mainScreen];
    CGFloat width = mainScreen.nativeBounds.size.width / mainScreen.nativeScale;
    CGFloat height = mainScreen.nativeBounds.size.height / mainScreen.nativeScale;
    BOOL isIpad = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
    BOOL hasIPadProWidth = fabs(width - 1024.f) < DBL_EPSILON;
    BOOL hasIPadProHeight = fabs(height - 1366.f) < DBL_EPSILON;
    return isIpad && hasIPadProHeight && hasIPadProWidth;
}

Обратите внимание, что это работает только для iOS8 +

Ответ 4

Благодаря @Mc.Lover

Небольшое обновление для ориентации Portrait и Landscape:

if (([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && ([UIScreen mainScreen].bounds.size.height == 1366 || [UIScreen mainScreen].bounds.size.width == 1366))) {
//iPad Pro
}

Ответ 5

Фиксированное решение для Swift 3 +

Есть два решения: первый, который я использовал в своем проекте, вы можете использовать любой из них.

1- Использование макроса

2- Использование расширения

Использование макроса

#define iPadPro129 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad && 
                                  UIScreen.mainScreen.nativeBounds.size.height == 2732) 

#define iPadPro105 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad && 
                                  UIScreen.mainScreen.nativeBounds.size.height == 2224) 

Использование расширения

extension UIDevice {

    // for ipad pro 12.9 device
     public var isPadPro129: Bool {
         if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad 
             && UIScreen.main.nativeBounds.size.height == 2732) {
              return true
         }
         return false
     }



  // for ipad pro 10.5 device
     public var isPadPro105: Bool {
         if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad 
             && UIScreen.main. nativeBounds.size.height == 2224) {
              return true
         }
         return false
     }

}

Ответ 6

Быстрая версия решения D1mers0n.

func isIpadPro() -> Bool
{
    if (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad &&
        (UIScreen.mainScreen().bounds.size.height == 1366 || UIScreen.mainScreen().bounds.size.width == 1366)) {
        return true
    }
    return false
}

Ответ 7

В соответствии со стандартами/практикой Swift3 лучшим подходом будет:

extension UIDevice {

     public var isiPadPro12: Bool {
         if UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad 
             && (UIScreen.main.bounds.size.height == 1366 || UIScreen.main.bounds.size.width == 1366) {
              return true
         }
         return false
     }

}

Добавление этого параметра в extension of UIDevice позволяет вам вызвать, что является аккуратным:

UIDevice.current.isiPadPro12

В один прекрасный день Apple, наконец, даст нам значение enum!

Ответ 8

Это не лучшее долгосрочное решение, но оно будет работать для вас сегодня...

Получить аппаратную строку для устройства...

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);

NSString *hardwareString = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
free(machine);

Сравните аппаратную строку с этими строками hw:

if ([hardwareString isEqualToString:@"iPad6,7"] || [hardwareString isEqualToString:@"iPad6,8"]) {
    // iPad Pro
}

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

Ответ 9

Swift 3 версия решения Джастина Домница решения D1mers0n:

func isIpadPro12() -> Bool
    {
        if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad 
        && (UIScreen.main.bounds.size.height == 1366 || UIScreen.main.bounds.size.width == 1366)) {
            return true
        }
        return false
    }

Ответ 10

Это то, что я использую для :

extension UIDevice {

    public class var isiPad: Bool {
        return UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad
    }

    public class var isiPadPro129: Bool {
        return isiPad && UIScreen.main.nativeBounds.size.height == 2732
    }

    public class var isiPadPro97: Bool {
        return isiPad && UIScreen.main.nativeBounds.size.height == 2048
    }

    public class var isiPadPro: Bool {
        return isiPad && (isiPadPro97 || isiPadPro129)
    }

}

Ответ 11

Мое решение в Objective-C с использованием макросов:

define IS_IPAD_DEVICE   ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])    
define IS_IPAD_IDIOM    (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)    
define IS_IPAD          (IS_IPAD_DEVICE || IS_IPAD_IDIOM)    
define IS_PORTRAIT                              UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])    
define IS_LANDSCAPE                             UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])    
define IS_IPAD_PRO_12_9  (IS_IPAD && ((IS_PORTRAIT && [[UIScreen mainScreen] nativeBounds].size.height == 2732.0) || (IS_LANDSCAPE && [[UIScreen mainScreen] nativeBounds].size.height == 2048.0)))    
define IS_IPAD_PRO_11    (IS_IPAD && ((IS_PORTRAIT && [[UIScreen mainScreen] nativeBounds].size.height == 2388.0) || (IS_LANDSCAPE && [[UIScreen mainScreen] nativeBounds].size.height == 1668.0)))    
define IS_IPAD_PRO_10_5  (IS_IPAD && ((IS_PORTRAIT && [[UIScreen mainScreen] nativeBounds].size.height == 2224.0) || (IS_LANDSCAPE && [[UIScreen mainScreen] nativeBounds].size.height == 1668.0)))    
define IS_IPAD_OR_MINI   (IS_IPAD && ((IS_PORTRAIT && [[UIScreen mainScreen] nativeBounds].size.height == 2048.0) || (IS_LANDSCAPE && [[UIScreen mainScreen] nativeBounds].size.height == 1536.0)))