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
Создать константу
struct App { static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false }
Используйте как это
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 { ... }