iOS detecta si el usuario está en un iPad


260

Tengo una aplicación que se ejecuta en el iPhone y el iPod Touch, se puede ejecutar en el iPad Retina y todo, pero debe haber un ajuste. Necesito detectar si el dispositivo actual es un iPad. ¿Qué código puedo usar para detectar si el usuario está usando un iPad en mi UIViewControllery luego cambiar algo en consecuencia?

Respuestas:


589

Hay bastantes formas de verificar si un dispositivo es un iPad. Esta es mi forma favorita de verificar si el dispositivo es de hecho un iPad:

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
    return YES; /* Device is iPad */
}

La forma en que lo uso

#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. */
}   

Otros ejemplos

if ( [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"] ) {
    return YES; /* Device is iPad */
}

#define IPAD     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
if ( IPAD ) 
     return YES;

Para una solución Swift, vea esta respuesta: https://stackoverflow.com/a/27517536/2057171


23
La forma en que lo usa no es tan eficiente como podría ser. UI_USER_INTERFACE_IDIOM()es equivalente a ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Usted puede ser mejor almacenamiento en caché el resultado en alguna parte: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos

77
Usaría hasPrefix en lugar de isEqualToString en su último método. De esta manera, el código también funciona en el simulador.
elbuild

18
Swift:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
Pang

2
Godawful uso de macros. Gran manera de ofuscar su código.
gnasher729

2
@ gnasher729 Más de 500 personas tienden a estar en desacuerdo contigo. En lugar de los comentarios sarcásticos, ¿por qué no proporciona su propia respuesta, ya que cree que tiene una mejor manera de hacerlo?
WrightsCS

162

En Swift puede usar las siguientes igualdades para determinar el tipo de dispositivo en las aplicaciones universales:

UIDevice.current.userInterfaceIdiom == .phone
// or
UIDevice.current.userInterfaceIdiom == .pad

El uso sería algo así como:

if UIDevice.current.userInterfaceIdiom == .pad {
    // Available Idioms - .pad, .phone, .tv, .carPlay, .unspecified
    // Implement your logic here
}

3
Estoy editando un enlace a su respuesta en la respuesta aceptada. (De esta manera también obtienes crédito). A pesar de que esta es una pregunta objetiva-c, ¡muchas personas que ven esta pregunta provienen de Google y pueden estar buscando una solución Swift! : D
Albert Renshaw

1
Gracias, @AlbertRenshaw. Yo también pensé lo mismo. :) Por cierto: no creo que la intención de la pregunta fuera preguntar específicamente por Objective-C, sino por iOS (que era Obj-C en ese momento). Al menos habría esperado encontrar la respuesta bajo esta pregunta para Swift también.
Jeehut

Hola @sevensevens, gracias por tus comentarios. Acabo de probar esto y funcionó para mí en XCode 7.2 dirigido a iOS 9 en el simulador. ¿Qué versión de XCode estás usando? ¿Quizás no funciona en XCodes anteriores? Los documentos dicen que userInterfaceIdiomestá 'Disponible en iOS 3.2 y versiones posteriores'. así que ese no debería ser el problema.
Jeehut

¿O podría ser que está ejecutando una aplicación solo para iPhone en el simulador de iPad? En ese caso, eso explicaría la confusión, pero también debería comportarse de esta manera en dispositivos reales, creo. Como @Yunus Nedim Mehel señala en los comentarios de @Richards, responde que la situación volverá en .Phonelugar de .Pad.
Jeehut

Lo siento, tenía el simulador configurado para iPhone. Tengo que dejar de realizar cambios a las 2AM
sevensevens

35

Esto es parte de UIDevice a partir de iOS 3.2, por ejemplo:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

44
el idioma generalmente es mejor, pero si está ejecutando una aplicación de iPhone en iPad, esto devolverá UIUserInterfaceIdiomPhone.
Yunus Nedim Mehel

25

También puedes usar esto

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

24

UI_USER_INTERFACE_IDIOM()solo devuelve el iPad si la aplicación es para iPad o Universal. Si es una aplicación de iPhone que se ejecuta en un iPad, entonces no lo hará. Por lo tanto, debería verificar el modelo.


15

Tenga cuidado: si su aplicación está dirigida solo a un dispositivo iPhone, el iPad que se ejecuta con el modo compatible con iPhone devolverá falso para la siguiente declaración:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

La forma correcta de detectar un dispositivo iPad físico es:

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

15

Descubrí que alguna solución no me funcionó en el simulador dentro de Xcode. En cambio, esto funciona:

ObjC

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([[deviceModel substringWithRange:NSMakeRange(0, 4)] isEqualToString:@"iPad"]) {
    DebugLog(@"iPad");
} else {
    DebugLog(@"iPhone or iPod Touch");
}

Rápido

if UIDevice.current.model.hasPrefix("iPad") {
    print("iPad")
} else {
    print("iPhone or iPod Touch")
}

También en los 'Otros ejemplos' en Xcode, el modelo del dispositivo regresa como 'Simulador de iPad', por lo que el ajuste anterior debería solucionarlo.


Tal vez Apple actualizó el simulador para decir algo como "simulador de iPad" o "iPad 2.1" o algo así ... si ese es el caso que podría usar en hasSuffix:@"iPad"lugar de isEqualToString@"iPad"... su mejor opción es registrar el modelo de dispositivo que el simulador devuelve y listo a partir de ahí ...
Albert Renshaw

8

Muchas formas de hacerlo en Swift :

Verificamos el modelo a continuación (solo podemos hacer una búsqueda sensible a mayúsculas y minúsculas aquí):

class func isUserUsingAnIpad() -> Bool {
    let deviceModel = UIDevice.currentDevice().model
    let result: Bool = NSString(string: deviceModel).containsString("iPad")
    return result
}

Verificamos el modelo a continuación (podemos hacer una búsqueda sensible a mayúsculas / minúsculas aquí):

    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().userInterfaceIdioma continuación solo devuelve el iPad si la aplicación es para iPad o Universal. Si se trata de una aplicación de iPhone que se ejecuta en un iPad, entonces no lo hará. Por lo tanto, debería verificar el modelo. :

    class func isUserUsingAnIpad() -> Bool {
        if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
            return true
        } else {
            return false
        }
   }

Este fragmento a continuación no se compila si la clase no hereda de un UIViewController, de lo contrario, funciona bien. Independientemente UI_USER_INTERFACE_IDIOM()solo devuelve iPad si la aplicación es para iPad o Universal. Si se trata de una aplicación de iPhone que se ejecuta en un iPad, entonces no lo hará. Por lo tanto, debería verificar el modelo. :

class func isUserUsingAnIpad() -> Bool {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
        return true
    } else {
        return false
    }
}

2
No creo que sea necesario reescribir respuestas antiguas a preguntas etiquetadas como Objective-C para agilizar.
Christian Schnorr

44
Definitivamente creo que mi respuesta es útil porque, en primer lugar, todas las respuestas están dispersas en el desbordamiento de la pila. En segundo lugar, lo que funcionaba con versiones anteriores de iOS no funciona correctamente a veces con iOS 8 y superior. Así que probé estas soluciones y esta respuesta puede ser muy útil. Así que no estoy de acuerdo contigo en absoluto.
King-Wizard

Además de eso, la sintaxis es diferente en Swift. Por lo tanto, siempre es útil para todos hacer una copia inteligente y pegar la respuesta y comprender los detalles y tuercas actualizados específicos.
King-Wizard


8

* *

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

8

Muchas respuestas son buenas, pero las uso así en Swift 4

  1. Crear constante

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Usar así

    if App.isRunningOnIpad {
        return load(from: .main, identifier: identifier)
    } else {
        return load(from: .ipad, identifier: identifier)
    }

Editar: como se sugiere, Cœur simplemente crea una extensión en UIDevice

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

3
¿Por qué molestarse con una Appestructura cuando puedes hacer lo mismo con una UIDeviceextensión?
Coeur

3

Puede consultar rangeOfString para ver la palabra que existe iPad así.

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([deviceModel rangeOfString:@"iPad"].location != NSNotFound)  {
NSLog(@"I am an iPad");
} else {
NSLog(@"I am not an iPad");
}

["I am not an iPad" rangeOfString:@"iPad"].location != NSNotFounddevuelve verdadero
Coeur

2

Otra forma más rápida:

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

Uso:

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

En Swift 4.2 y 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
}

Si quieres detectar un dispositivo específico

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
}

1

¿Por qué tan complicado? Así es como lo hago ...

Swift 4:

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

De esta manera solo puedes decir if iPad {}


1
Nota: Esta pregunta se hizo en 2012
Albert Renshaw

0

Para las últimas versiones de iOS, simplemente agregue UITraitCollection:

extension UITraitCollection {

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

y luego en UIViewControllersolo verificar:

if traitCollection.isIpad { ... }

44
¿Esto también funciona cuando la aplicación para iPad está en modo de pantalla dividida? Entonces la clase de tamaño horizontal sería compacta.
Oliver

0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.