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

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

17 ответов

Решение

Есть немало способов проверить, является ли устройство 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 см. Этот ответ: /questions/21020467/ios-opredelyaet-nahoditsya-li-polzovatel-na-ipad/21020478#21020478

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

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

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

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

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

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

Я обнаружил, что какое-то решение не работает для меня в симуляторе в 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", так что вышеупомянутая настройка должна разобраться с этим.

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

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

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

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

Многие ответы хороши, но я использую это в Swift 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

}

Есть много способов сделать это в 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
    }
}

*

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

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

Вы можете проверить 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");
}

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

Свифт 4:

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

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

Еще один 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's an iPhone!
}

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

if UIDevice.type == TV {
    //it's an TV!
}
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }

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

У меня есть приложение (первоначально приложение для iPad), которое я хочу запустить как на iPad, так и на Mac под управлением Catalyst. Я использую параметр plist для масштабирования интерфейса Mac в соответствии с iPad, но хотел бы перейти на AppKit, если это разумно. При работе на Mac я считаю, что все вышеупомянутые подходы говорят мне, что я на iPad. Подделка Catalyst довольно тщательная.

Для большинства проблем я действительно понимаю, что код должен делать вид, что он на iPad, когда он работает на Mac. Единственным исключением является то, что средство выбора недоступно на Mac с Catalyst, но есть на iPad. Я хочу выяснить, создавать ли UIPickerView или делать что-то другое во время выполнения. Выбор времени выполнения имеет решающее значение, потому что я хочу использовать один двоичный файл для работы как на iPad, так и на Mac в долгосрочной перспективе, максимально используя поддерживаемые стандарты пользовательского интерфейса на каждом из них.

API-интерфейсы дают потенциально вводящие в заблуждение результаты для случайного читателя до Catalyst. Например, [UIDevice currentDevice].modelвозвращается @"iPad"при работе под Catalyst на Mac. Идиоматические API-интерфейсы пользовательского интерфейса поддерживают ту же иллюзию.

Я обнаружил, что вам действительно нужно смотреть глубже. Начну с этой информации:

      NSString *const deviceModel = [UIDevice currentDevice].model;
NSProcessInfo *const processInfo = [[NSProcessInfo alloc] init];
const bool isIosAppOnMac = processInfo.iOSAppOnMac;  // Note: this will be "no" under Catalyst
const bool isCatalystApp = processInfo.macCatalystApp;

Затем вы можете комбинировать эти запросы с такими выражениями, как [deviceModel hasPrefix: @"iPad"]чтобы разобраться в тонкостях, с которыми я сталкиваюсь. В моем случае я явно хочу избежать создания UIPickerView, если указанный isCatalystAppявляется true, независимо от «вводящей в заблуждение» информации об интерфейсной идиоме или иллюзий, поддерживаемых isIosAppOnMacа также deviceModel.

Теперь мне любопытно, что произойдет, если я перееду приложение Mac, чтобы переехать на коляске iPad...

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

extension UITraitCollection {

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

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

if traitCollection.isIpad { ... }
Другие вопросы по тегам