iOS определяет, находится ли пользователь на iPad

201

У меня есть приложение, которое работает на iPhone и iPod Touch, оно может работать на iPad Retina и все, но должна быть одна настройка. Мне нужно определить, является ли текущее устройство iPad. Какой код я могу использовать, чтобы определить, использует ли пользователь iPad в моем UIViewController, а затем что-то изменить?

Теги:
ipad
device

15 ответов

532
Лучший ответ

Существует несколько способов проверить, является ли устройство iPad. Это мой любимый способ проверить, действительно ли устройство является iPad:

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
    return YES; /* Device is iPad */
}

Способ использования

#define IDIOM    UI_USER_INTERFACE_IDIOM()
#define IPAD     UIUserInterfaceIdiomPad

if ( IDIOM == IPAD ) {
    /* do something specifically for iPad. */
} else {
    /* do something specifically for iPhone or iPod touch. */
}   

Другие примеры

if ( [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"] ) {
    return YES; /* Device is iPad */
}

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
if ( IPAD ) 
     return YES;

Для решения Swift см. этот ответ: https://stackoverflow.com/questions/10167221/ios-detect-if-user-is-on-an-ipad

  • 2
    Замечательно! Спасибо! Как раз то, что я искал! :)
  • 22
    То, как вы используете его, не так эффективно, как могло бы быть. UI_USER_INTERFACE_IDIOM() эквивалентно ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone) . Возможно, вам лучше где-нибудь кэшировать результат: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) …
Показать ещё 10 комментариев
94

В Swift вы можете использовать следующие равенства, чтобы определить тип устройства:

UIDevice.current.userInterfaceIdiom == .phone
// or
UIDevice.current.userInterfaceIdiom == .pad

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

if UIDevice.current.userInterfaceIdiom == .pad {
    // Available Idioms - .pad, .phone, .tv, .carPlay, .unspecified
    // Implement your logic here
}
  • 2
    Я редактирую ссылку на ваш ответ в принятый ответ. (Таким образом, вы получаете кредит тоже). Несмотря на то, что это объективный вопрос, многие люди, просматривающие этот вопрос, приходят из Google и могут искать решение Swift! : D
  • 1
    Спасибо, @AlbertRenshaw. Я тоже так думал. :) Кстати: я не думаю, что целью вопроса было спросить специально для Objective-C, но для iOS (который был Obj-C в тот момент). По крайней мере, я ожидал найти ответ на этот вопрос и для Свифта.
Показать ещё 4 комментария
32

Это часть UIDevice с iOS 3.2, например:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad
  • 4
    идиома, как правило, лучше, но если вы запускаете приложение для iphone на iPad, это вернет UIUserInterfaceIdiomPhone.
26

Вы также можете использовать этот

#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
   // iPad
} else {
   // iPhone / iPod Touch
}
  • 0
    Ницца! Должен любить лаконичный синтаксис.
17

UI_USER_INTERFACE_IDIOM() возвращает iPad только в том случае, если приложение предназначено для iPad или Universal. Если его приложение iPhone работает на iPad, это не будет. Поэтому вы должны проверить модель.

  • 1
    Это была именно моя проблема. К сожалению, я просмотрел ваш ответ несколько часов назад.
9

Будьте осторожны: если ваше приложение предназначено только для устройства iPhone, iPad, работающий с совместимым с iphone режимом, вернет false для инструкции ниже:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

Правильный способ обнаружения физического устройства iPad:

#define IS_IPAD_DEVICE      ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])
9

Я обнаружил, что это не сработало для меня в симуляторе в Xcode 4.5

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([[deviceModel substringWithRange:NSMakeRange(0, 4)] isEqualToString:@"iPad"]) {
    DebugLog(@"iPad");
} else {
    DebugLog(@"iPhone or iPod Touch");
}

Также в "Other Examples" в Xcode модель устройства возвращается как "iPad Simulator", поэтому вышеупомянутая настройка должна сортировать ее.

  • 0
    Может быть, Apple обновила симулятор, чтобы сказать что-то вроде «iPad simulator» или «iPad 2.1» или что-то ... если это так, вы можете использовать hasSuffix:@"iPad" вместо isEqualToString@"iPad" ... ваша лучшая ставка - Записать модель устройства, которое симулятор возвращает и отправляется оттуда ...
  • 0
    * ^ Я имел ввиду hasPrefix конечно ... хаха
8

Много способов сделать это в Swift:

Мы проверяем приведенную ниже модель (мы можем делать только чувствительный к регистру поиск):

class func isUserUsingAnIpad() -> Bool {
    let deviceModel = UIDevice.currentDevice().model
    let result: Bool = NSString(string: deviceModel).containsString("iPad")
    return result
}

Мы проверяем приведенную ниже модель (мы можем делать чувствительный к регистру/нечувствительный поиск здесь):

    class func isUserUsingAnIpad() -> Bool {
        let deviceModel = UIDevice.currentDevice().model
        let deviceModelNumberOfCharacters: Int = count(deviceModel)
        if deviceModel.rangeOfString("iPad",
                                     options: NSStringCompareOptions.LiteralSearch,
                                     range: Range<String.Index>(start: deviceModel.startIndex,
                                                                end: advance(deviceModel.startIndex, deviceModelNumberOfCharacters)),
                                     locale: nil) != nil {
            return true
        } else {
            return false
        }
   }

UIDevice.currentDevice().userInterfaceIdiom ниже только возвращает iPad, если приложение предназначено для iPad или Universal. Если это приложение для iPhone, запущенное на iPad, то этого не произойдет. Поэтому вы должны проверить модель.

    class func isUserUsingAnIpad() -> Bool {
        if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
            return true
        } else {
            return false
        }
   }

Этот фрагмент ниже не компилируется, если класс не наследует UIViewController, в противном случае он работает нормально. Независимо от того, что UI_USER_INTERFACE_IDIOM() возвращает iPad, если приложение предназначено для iPad или Universal. Если это приложение для iPhone, запущенное на iPad, то этого не произойдет. Поэтому вы должны проверить модель.

class func isUserUsingAnIpad() -> Bool {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
        return true
    } else {
        return false
    }
}
  • 2
    Я не думаю, что есть необходимость переписывать старые ответы на вопросы, помеченные Objective-C, чтобы быстро.
  • 4
    Я определенно думаю, что мой ответ полезен, потому что, во-первых, все ответы разбросаны по переполнению стека. Во-вторых, то, что работало со старыми версиями iOS, не всегда корректно работает с iOS 8 и выше. Поэтому я проверил эти решения, и этот ответ может быть очень полезным. Так что я не согласен с вами вообще.
Показать ещё 2 комментария
6

*

В быстрой версии 3.0

*

 if UIDevice.current.userInterfaceIdiom == .pad {
        //pad
    } else if UIDevice.current.userInterfaceIdiom == .phone {
        //phone
    } else if UIDevice.current.userInterfaceIdiom == .tv {
        //tv
    } else if UIDevice.current.userInterfaceIdiom == .carPlay {
        //CarDisplay
    } else {
        //unspecified
    }
3

Вы можете проверить rangeOfString, чтобы увидеть, что iPad существует именно так.

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([deviceModel rangeOfString:@"iPad"].location != NSNotFound)  {
NSLog(@"I am an iPad");
} else {
NSLog(@"I am not an iPad");
}
  • 0
    Хороший ответ :).
  • 1
    ужасный ответ
Показать ещё 1 комментарий
1

Еще один метод Swifty:

//MARK: -  Device Check
let iPad = UIUserInterfaceIdiom.Pad
let iPhone = UIUserInterfaceIdiom.Phone
@available(iOS 9.0, *) /* AppleTV check is iOS9+ */
let TV = UIUserInterfaceIdiom.TV

extension UIDevice {
    static var type: UIUserInterfaceIdiom 
        { return UIDevice.currentDevice().userInterfaceIdiom }
}

Использование:

if UIDevice.type == iPhone {
    //it an iPhone!
}

if UIDevice.type == iPad {
    //it an iPad!
}

if UIDevice.type == TV {
    //it an TV!
}
  • 1
    голосование за смайликов 
0

РЕДАКТИРОВАТЬ: Настоящий iPhone X возвращает идиомный телефон, так что это всего лишь ошибка в симуляторе.

iPhoneX возвращает idiom iPad (по крайней мере, в симуляторе, реальное устройство поступит в продажу через пару дней), хотя это iPhone. Поэтому правильным ответом является использование имени устройства.

Swift 4:

var iPad : Bool {
    return UIDevice.current.model.contains("iPad")
}

Obj-C:

- (BOOL)iPad {
  return ([deviceModel rangeOfString:@"iPad"].location != NSNotFound
}
0

Почему так сложно? Вот как я это делаю...

Swift 4:

var iPad : Bool {
    return UIDevice.current.model.contains("iPad")
}

Таким образом вы можете просто сказать if iPad {}

  • 1
    Примечание: этот вопрос был задан в 2012 году
0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
0

Для последних версий iOS просто добавьте UITraitCollection:

extension UITraitCollection {

    var isIpad: Bool {
        return horizontalSizeClass == .regular && verticalSizeClass == .regular
    }
}

а затем внутри UIViewController просто проверьте:

if traitCollection.isIpad { ... }
  • 4
    Это также работает, когда iPad-приложение находится в режиме разделения экрана? Тогда класс горизонтального размера будет компактным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню