Detect current device with UI_USER_INTERFACE_IDIOM() in Swift
When working with Swift, you can use the enum
UIUserInterfaceIdiom
, defined as:
enum UIUserInterfaceIdiom : Int { case unspecified case phone // iPhone and iPod touch style UI case pad // iPad style UI (also includes macOS Catalyst)}
So you can use it as:
UIDevice.current.userInterfaceIdiom == .padUIDevice.current.userInterfaceIdiom == .phoneUIDevice.current.userInterfaceIdiom == .unspecified
Or with a Switch statement:
switch UIDevice.current.userInterfaceIdiom { case .phone: // It's an iPhone case .pad: // It's an iPad (or macOS Catalyst) @unknown default: // Uh, oh! What could it be? }
UI_USER_INTERFACE_IDIOM()
is an Objective-C macro, which is defined as:
#define UI_USER_INTERFACE_IDIOM() \ ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? \ [[UIDevice currentDevice] userInterfaceIdiom] : \ UIUserInterfaceIdiomPhone)
Also, note that even when working with Objective-C, the UI_USER_INTERFACE_IDIOM()
macro is only required when targeting iOS 3.2 and below. When deploying to iOS 3.2 and up, you can use [UIDevice userInterfaceIdiom]
directly.
You should use this GBDeviceInfo framework or ...
Apple defines this:
public enum UIUserInterfaceIdiom : Int { case unspecified case phone // iPhone and iPod touch style UI case pad // iPad style UI @available(iOS 9.0, *) case tv // Apple TV style UI @available(iOS 9.0, *) case carPlay // CarPlay style UI}
so for the strict definition of the device can be used this code
struct ScreenSize{ static let SCREEN_WIDTH = UIScreen.main.bounds.size.width static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)}struct DeviceType{ static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0 static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0 static let IS_IPHONE_6_7 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0 static let IS_IPHONE_6P_7P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0 static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0 static let IS_IPAD_PRO = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0}
how to use
if DeviceType.IS_IPHONE_6P_7P { print("IS_IPHONE_6P_7P")}
to detect iOS version
struct Version{ static let SYS_VERSION_FLOAT = (UIDevice.current.systemVersion as NSString).floatValue static let iOS7 = (Version.SYS_VERSION_FLOAT < 8.0 && Version.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (Version.SYS_VERSION_FLOAT >= 8.0 && Version.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0 && Version.SYS_VERSION_FLOAT < 10.0)}
how to use
if Version.iOS8 { print("iOS8")}
Swift 2.0 & iOS 9 & Xcode 7.1
// 1. request an UITraitCollection instancelet deviceIdiom = UIScreen.mainScreen().traitCollection.userInterfaceIdiom// 2. check the idiomswitch (deviceIdiom) {case .Pad: print("iPad style UI")case .Phone: print("iPhone and iPod touch style UI")case .TV: print("tvOS style UI")default: print("Unspecified UI idiom")}
Swift 3.0 and Swift 4.0
// 1. request an UITraitCollection instancelet deviceIdiom = UIScreen.main.traitCollection.userInterfaceIdiom// 2. check the idiomswitch (deviceIdiom) {case .pad: print("iPad style UI")case .phone: print("iPhone and iPod touch style UI")case .tv: print("tvOS style UI")default: print("Unspecified UI idiom")}
Use UITraitCollection.The iOS trait environment is exposed though the traitCollection property of the UITraitEnvironment protocol. This protocol is adopted by the following classes:
- UIScreen
- UIWindow
- UIViewController
- UIPresentationController
- UIView