Search code examples
iosiphoneobjective-cipadswift

Detect current device with UI_USER_INTERFACE_IDIOM() in Swift


What is the equivalent of UI_USER_INTERFACE_IDIOM() in Swift to detect between iPhone and iPad?

I get an Use of unresolved identifier error when compiling in Swift.


Solution

  • 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 == .pad
    UIDevice.current.userInterfaceIdiom == .phone
    UIDevice.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.