Detectar el dispositivo actual con UI_USER_INTERFACE_IDIOM() en Swift

Resuelto Berry Blue asked hace 54 años • 18 respuestas

¿Cuál es el equivalente UI_USER_INTERFACE_IDIOM()en Swift para detectar entre iPhone y iPad?

Recibo un Use of unresolved identifiererror al compilar en Swift.

Berry Blue avatar Jan 01 '70 08:01 Berry Blue
Aceptado

Cuando trabaje con Swift, puede utilizar enum UIUserInterfaceIdiom, definido como:

enum UIUserInterfaceIdiom : Int {
    case unspecified
    
    case phone // iPhone and iPod touch style UI
    case pad   // iPad style UI (also includes macOS Catalyst)
}

Entonces puedes usarlo como:

UIDevice.current.userInterfaceIdiom == .pad
UIDevice.current.userInterfaceIdiom == .phone
UIDevice.current.userInterfaceIdiom == .unspecified

O con una declaración Switch:

    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()es una macro de Objective-C, que se define como:

#define UI_USER_INTERFACE_IDIOM() \ ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? \ [[UIDevice currentDevice] userInterfaceIdiom] : \ UIUserInterfaceIdiomPhone)

Además, tenga en cuenta que incluso cuando se trabaja con Objective-C, la UI_USER_INTERFACE_IDIOM()macro solo es necesaria cuando se utiliza iOS 3.2 y versiones inferiores. Al implementar en iOS 3.2 y versiones posteriores, puede usarlo [UIDevice userInterfaceIdiom]directamente.

Cezar avatar Jun 05 '2014 11:06 Cezar

Deberías usar este marco GBDeviceInfo o...

Apple define esto:

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
}

por lo que para la definición estricta del dispositivo se puede utilizar este código

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
}

cómo utilizar

if DeviceType.IS_IPHONE_6P_7P {
    print("IS_IPHONE_6P_7P")
}

para detectar la versión de iOS

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)
}

cómo utilizar

if Version.iOS8 {
    print("iOS8")
}
Beslan Tularov avatar Apr 14 '2015 08:04 Beslan Tularov

si/si no caso:

 if UIDevice.current.userInterfaceIdiom == .pad {
     // iPad
 } else {
     // not iPad (iPhone, mac, tv, carPlay, unspecified)
 }
Masterfego avatar Mar 16 '2015 14:03 Masterfego

Rápido 2.0 y iOS 9 y Xcode 7.1

// 1. request an UITraitCollection instance
let deviceIdiom = UIScreen.mainScreen().traitCollection.userInterfaceIdiom

// 2. check the idiom
switch (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")

}

Rápido 3.0 y Rápido 4.0

// 1. request an UITraitCollection instance
let deviceIdiom = UIScreen.main.traitCollection.userInterfaceIdiom

// 2. check the idiom
switch (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")
}

Utilice UITraitCollection. El entorno de rasgos de iOS está expuesto a través de la propiedad traceCollection del protocolo UITraitEnvironment. Este protocolo es adoptado por las siguientes clases:

  • Pantalla UIS
  • Ventana UI
  • Controlador UIView
  • Controlador de presentación UI
  • UIView
user3378170 avatar Aug 31 '2015 12:08 user3378170