У меня есть приложение, которое работает на iPhone и iPod Touch, оно может работать на iPad Retina и все, но должна быть одна настройка. Мне нужно определить, является ли текущее устройство iPad. Какой код я могу использовать, чтобы определить, использует ли пользователь iPad в моем UIViewController
, а затем что-то изменить?
Существует несколько способов проверить, является ли устройство 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
В 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, это не будет. Поэтому вы должны проверить модель.
Будьте осторожны: если ваше приложение предназначено только для устройства iPhone, iPad, работающий с совместимым с iphone режимом, вернет false для инструкции ниже:
#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
Правильный способ обнаружения физического устройства iPad:
#define IS_IPAD_DEVICE ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])
Я обнаружил, что это не сработало для меня в симуляторе в 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", поэтому вышеупомянутая настройка должна сортировать ее.
hasSuffix:@"iPad"
вместо isEqualToString@"iPad"
... ваша лучшая ставка - Записать модель устройства, которое симулятор возвращает и отправляется оттуда ...
hasPrefix
конечно ... хаха
Много способов сделать это в 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
}
}
*
В быстрой версии 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
}
Вы можете проверить 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");
}
Еще один метод 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!
}
РЕДАКТИРОВАТЬ: Настоящий 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
}
Почему так сложно? Вот как я это делаю...
Swift 4:
var iPad : Bool {
return UIDevice.current.model.contains("iPad")
}
Таким образом вы можете просто сказать if iPad {}
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
{
print("This is iPad")
}else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
{
print("This is iPhone");
}
Для последних версий iOS просто добавьте UITraitCollection
:
extension UITraitCollection {
var isIpad: Bool {
return horizontalSizeClass == .regular && verticalSizeClass == .regular
}
}
а затем внутри UIViewController
просто проверьте:
if traitCollection.isIpad { ... }
UI_USER_INTERFACE_IDIOM()
эквивалентно([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)
. Возможно, вам лучше где-нибудь кэшировать результат:BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) …