it-swarm.com.ru

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

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

219
Albert Renshaw

Есть немало способов проверить, является ли устройство 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

554
WrightsCS

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

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

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad
33
Richard

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

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

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

19
malhal

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

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

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

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

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

11
Andy Davies

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

*

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

Вы можете проверить rangeOfString, чтобы увидеть, что Word 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");
}
3
LearningGuy

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

Правка: Как предложено, мы можем просто создать расширение на UIDevice

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

}

3
Rohit Sisodia

Еще один способ 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!
}
2
Aviel Gross

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

Swift 4:

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

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

1
The Ruffus

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

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

extension UITraitCollection {

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

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

if traitCollection.isIpad { ... }
0
Bartłomiej Semańczyk
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
0
Rajesh Sharma