iOS визначає, чи є користувач на iPad


260

У мене є додаток, який працює на iPhone і iPod Touch, він може працювати на iPina Retina і все, але потрібно здійснити одну корекцію. Мені потрібно виявити, чи поточний пристрій iPad. Який код я можу використовувати, щоб виявити, чи користувач використовує iPad в моєму, UIViewControllerа потім щось відповідно змінити?

Відповіді:


589

Існує досить багато способів перевірити, чи пристрій є 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/a/27517536/2057171


23
Те, як ви користуєтесь ним, не настільки ефективне, як могло б бути. UI_USER_INTERFACE_IDIOM()еквівалентно ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Ви могли б бути краще кешувати результат де - то: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Марсело Кантос

7
Я б використав hasPrefix замість isEqualToString у вашому останньому методі. Таким чином код працює і на тренажері.
elbuild

18
Свіфт:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
Панг

2
Поважне використання макросів. Прекрасний спосіб придушити свій код.
gnasher729

2
@ gnasher729 500+ людей, як правило, не згодні з вами. Замість примхливих коментарів, чому б ви не дали власної відповіді, оскільки вважаєте, що у вас є кращий спосіб зробити це.
WrightsCS

162

У 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
}

3
Я редагую посилання на вашу відповідь на прийняту відповідь. (Таким чином ви також отримуєте кредит). Незважаючи на те, що це об'єктивне питання, багато людей, які переглядають це питання, приходять з Google і можуть шукати рішення Swift! : D
Альберт Реншо

1
Дякую, @AlbertRenshaw Я так і думав. :) Btw: Я не думаю, що намір питання полягав у тому, щоб запитати спеціально для Objective-C, але для iOS (який був Obj-C на той момент). Принаймні, я б очікував, що відповідь під цим питанням знайде і для Свіфта.
Jeehut

Привіт @sevensevens, дякую за відгук. Я щойно спробував це, і він спрацював для мене в XCode 7.2, націленій на iOS 9 в тренажері. Яку версію XCode ви використовуєте? Можливо, він не працює на старих XCodes? Документи кажуть userInterfaceIdiom: "Доступно в iOS 3.2 та новіших версіях". так що це не повинно бути проблемою.
Jeehut

Або могло бути, що ви використовуєте лише додаток для iPhone на симуляторі iPad? У цьому випадку це пояснювало б заплутаність - але я думаю, що він повинен поводитись так і на реальних пристроях. Як зазначає @Yunus Недім Мехель у коментарі @Richards відповідь, що ситуація повернеться .Phoneзамість цього .Pad.
Jeehut

Вибачте - на тренажері встановлено iPhone. Ви повинні перестати вносити зміни о 2
годині ранку

35

Це частина UIDevice станом на iOS 3.2, наприклад:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
idiom, як правило, краще, але якщо ви запускаєте додаток для iphone на iPad, це поверне UIUserInterfaceIdiomPhone.
Юнус Недім Мехель

25

Ви також можете використовувати це

#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
   // iPad
} else {
   // iPhone / iPod Touch
}

24

UI_USER_INTERFACE_IDIOM()повертає iPad, лише якщо програма призначена для iPad або Universal. Якщо його додаток для iPhone працює на iPad, він не стане. Тож замість цього слід перевірити модель.


15

Будьте обережні: Якщо ваша програма орієнтована лише на пристрої iPhone, iPad, що працює в iphone-сумісному режимі, поверне помилкове значення нижче:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

Правильний спосіб виявлення фізичного пристрою iPad:

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

15

Я виявив, що якесь рішення не працює для мене в Simulator в межах Xcode. Натомість це працює:

ObjC

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

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

Швидкий

if UIDevice.current.model.hasPrefix("iPad") {
    print("iPad")
} else {
    print("iPhone or iPod Touch")
}

Також у розділі "Інші приклади" в Xcode модель пристрою повертається як "iPad Simulator", тому вищевказаний твіт повинен розібратися в цьому.


Можливо, Apple оновила тренажер, щоб сказати щось на кшталт "iPad simulator" або "iPad 2.1" чи щось таке ... якщо це так, ви можете використовувати його hasSuffix:@"iPad"замість isEqualToString@"iPad"... Ваша найкраща ставка - зареєструвати модель пристрою, що тренажер повернеться і піде звідти ...
Альберт Реншоу

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
        }
   }

Цей фрагмент нижче не компілюється, якщо клас не успадковує an 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 і вище. Тому я перевірив ці рішення, і ця відповідь може бути дуже корисною. Тож я з вами зовсім не згоден.
Король-Чарівник

Крім того, у Swift синтаксис інший. Тому завжди корисно всім робити інтелектуальну копіювальну пасту відповіді та розуміючи конкретні сучасні гайки та болти.
Король-Чарівник


8

*

У швидкому 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
    }

8

Багато відповідей хороші, але я використовую подібний у швидкому 4

  1. Створіть постійну

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Використовуйте так

    if App.isRunningOnIpad {
        return load(from: .main, identifier: identifier)
    } else {
        return load(from: .ipad, identifier: identifier)
    }

Редагувати: Як запропоновано Cœur, просто створіть розширення на UIDevice

extension UIDevice {
    static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}

3
Навіщо турбуватися з Appструктурою, коли ви можете зробити те ж саме з UIDeviceрозширенням?
Cœur

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");
}

["I am not an iPad" rangeOfString:@"iPad"].location != NSNotFoundповертає правду.
Cœur

2

Ще один швидкий спосіб:

//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's an iPhone!
}

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

if UIDevice.type == TV {
    //it's an TV!
}

2

У Swift 4.2 та Xcode 10

if UIDevice().userInterfaceIdiom == .phone {
    //This is iPhone
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
} else if UIDevice().userInterfaceIdiom == .tv {
    //This is Apple TV
}

Якщо ви хочете виявити конкретний пристрій

let screenHeight = UIScreen.main.bounds.size.height
if UIDevice().userInterfaceIdiom == .phone {
    if (screenHeight >= 667) {
        print("iPhone 6 and later")
    } else if (screenHeight == 568) {
        print("SE, 5C, 5S")
    } else if(screenHeight<=480){
        print("4S")
    }
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
}

1

Чому так складно? Ось як я це роблю ...

Швидкий 4:

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

Таким чином ви можете просто сказати if iPad {}


1
Примітка. Це запитання було задано у 2012 році
Альберт Реншо

0

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

extension UITraitCollection {

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

а потім протягом UIViewControllerпросто перевірити:

if traitCollection.isIpad { ... }

4
Це також працює, коли iPad-додаток знаходиться в режимі розділеного екрана? Тоді клас горизонтальних розмірів був би компактним.
Олівер

0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.