Обнаружение устройства iPad Pro
Я пытаюсь обнаружить устройство iPad Pro, пытаясь угадать его высоту с помощью:
NSLog(@"%f",self.view.frame.size.height);
Но он возвращает 1024
! такие же, как iPad не сетчатые устройства. любые советы?
Мне нужно указать некоторые коды для iPad Pro с этой строкой кода:
#define iPadPro ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && [UIScreen mainScreen].bounds.size.height == 2732)
... и коды должны обнаруживать iPad Pro даже на симуляторе iOS!
Спасибо
ИЗМЕНИТЬ:
Некоторые предлагают использовать LunchScreen, но когда я его использую, это происходит (уменьшено):
![введите описание изображения здесь]()
Ответы
Ответ 1
Особая благодарность @rmaddy
Правильный способ определения размеров экранов:
NSLog(@"%f",[UIScreen mainScreen].bounds.size.height);
Теперь, если ваше приложение работает в режиме Portrait
, вы можете просто использовать этот код для обнаружения iPad Pro:
#define iPadPro ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && [UIScreen mainScreen].bounds.size.height == 1366)
Не забывайте, что использование LaunchScreen или приложения не будет использовать расширенный экран iPad Pro.
Ответ 2
обнаруживает iPad про 12,9 дюйма независимо от ориентации устройства
#define iPadPro12 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad && UIScreen.mainScreen.nativeBounds.size.height == 2732)
Ответ 3
Вот проверка, которая будет работать независимо от ориентации устройства:
- (BOOL)isIpadPro
{
UIScreen *mainScreen = [UIScreen mainScreen];
CGFloat width = mainScreen.nativeBounds.size.width / mainScreen.nativeScale;
CGFloat height = mainScreen.nativeBounds.size.height / mainScreen.nativeScale;
BOOL isIpad = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
BOOL hasIPadProWidth = fabs(width - 1024.f) < DBL_EPSILON;
BOOL hasIPadProHeight = fabs(height - 1366.f) < DBL_EPSILON;
return isIpad && hasIPadProHeight && hasIPadProWidth;
}
Обратите внимание, что это работает только для iOS8 +
Ответ 4
Благодаря @Mc.Lover
Небольшое обновление для ориентации Portrait
и Landscape
:
if (([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && ([UIScreen mainScreen].bounds.size.height == 1366 || [UIScreen mainScreen].bounds.size.width == 1366))) {
//iPad Pro
}
Ответ 5
Фиксированное решение для Swift 3 +
Есть два решения: первый, который я использовал в своем проекте, вы можете использовать любой из них.
1- Использование макроса
2- Использование расширения
Использование макроса
#define iPadPro129 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad &&
UIScreen.mainScreen.nativeBounds.size.height == 2732)
#define iPadPro105 (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad &&
UIScreen.mainScreen.nativeBounds.size.height == 2224)
Использование расширения
extension UIDevice {
// for ipad pro 12.9 device
public var isPadPro129: Bool {
if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad
&& UIScreen.main.nativeBounds.size.height == 2732) {
return true
}
return false
}
// for ipad pro 10.5 device
public var isPadPro105: Bool {
if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad
&& UIScreen.main. nativeBounds.size.height == 2224) {
return true
}
return false
}
}
Ответ 6
Быстрая версия решения D1mers0n.
func isIpadPro() -> Bool
{
if (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad &&
(UIScreen.mainScreen().bounds.size.height == 1366 || UIScreen.mainScreen().bounds.size.width == 1366)) {
return true
}
return false
}
Ответ 7
В соответствии со стандартами/практикой Swift3 лучшим подходом будет:
extension UIDevice {
public var isiPadPro12: Bool {
if UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad
&& (UIScreen.main.bounds.size.height == 1366 || UIScreen.main.bounds.size.width == 1366) {
return true
}
return false
}
}
Добавление этого параметра в extension
of UIDevice
позволяет вам вызвать, что является аккуратным:
UIDevice.current.isiPadPro12
В один прекрасный день Apple, наконец, даст нам значение enum
!
Ответ 8
Это не лучшее долгосрочное решение, но оно будет работать для вас сегодня...
Получить аппаратную строку для устройства...
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *hardwareString = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
free(machine);
Сравните аппаратную строку с этими строками hw:
if ([hardwareString isEqualToString:@"iPad6,7"] || [hardwareString isEqualToString:@"iPad6,8"]) {
// iPad Pro
}
Если вам нравится, у меня есть класс, который обертывает все это, что я могу отправить вам. Никогда на самом деле он не отполировал его достаточно, чтобы выпустить из него блок, но при необходимости он будет доступен.
Ответ 9
Swift 3 версия решения Джастина Домница решения D1mers0n:
func isIpadPro12() -> Bool
{
if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad
&& (UIScreen.main.bounds.size.height == 1366 || UIScreen.main.bounds.size.width == 1366)) {
return true
}
return false
}
Ответ 10
Это то, что я использую для swift3:
extension UIDevice {
public class var isiPad: Bool {
return UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad
}
public class var isiPadPro129: Bool {
return isiPad && UIScreen.main.nativeBounds.size.height == 2732
}
public class var isiPadPro97: Bool {
return isiPad && UIScreen.main.nativeBounds.size.height == 2048
}
public class var isiPadPro: Bool {
return isiPad && (isiPadPro97 || isiPadPro129)
}
}
Ответ 11
Мое решение в Objective-C с использованием макросов:
define IS_IPAD_DEVICE ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])
define IS_IPAD_IDIOM (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
define IS_IPAD (IS_IPAD_DEVICE || IS_IPAD_IDIOM)
define IS_PORTRAIT UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])
define IS_LANDSCAPE UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])
define IS_IPAD_PRO_12_9 (IS_IPAD && ((IS_PORTRAIT && [[UIScreen mainScreen] nativeBounds].size.height == 2732.0) || (IS_LANDSCAPE && [[UIScreen mainScreen] nativeBounds].size.height == 2048.0)))
define IS_IPAD_PRO_11 (IS_IPAD && ((IS_PORTRAIT && [[UIScreen mainScreen] nativeBounds].size.height == 2388.0) || (IS_LANDSCAPE && [[UIScreen mainScreen] nativeBounds].size.height == 1668.0)))
define IS_IPAD_PRO_10_5 (IS_IPAD && ((IS_PORTRAIT && [[UIScreen mainScreen] nativeBounds].size.height == 2224.0) || (IS_LANDSCAPE && [[UIScreen mainScreen] nativeBounds].size.height == 1668.0)))
define IS_IPAD_OR_MINI (IS_IPAD && ((IS_PORTRAIT && [[UIScreen mainScreen] nativeBounds].size.height == 2048.0) || (IS_LANDSCAPE && [[UIScreen mainScreen] nativeBounds].size.height == 1536.0)))