¿Cómo se llega UI_USER_INTERFACE_IDIOM () para el trabajo con el iPhone OS SDK <3.2

StackOverflow https://stackoverflow.com/questions/2576356

  •  24-09-2019
  •  | 
  •  

Pregunta

Apple aconseja utilizar el siguiente código para detectar si se ejecuta en un iPad o iPhone / iPod Touch:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  // The device is an iPad running iPhone 3.2 or later.
  // [for example, load appropriate iPad nib file]
}
else {
  // The device is an iPhone or iPod touch.
  // [for example, load appropriate iPhone nib file]
}

El problema es que UI_USER_INTERFACE_IDIOM () y UIUserInterfaceIdiomPad no están definidos en los SDK anteriores a 3,2. Esto parece vencer por completo el propósito de tal función a. Sólo se pueden compilar y ejecutar en el iPhone OS 3.2 (iPhone OS 3.2 sólo se puede ejecutar en el iPad). Así que si se puede usar UI_USER_INTERFACE_IDIOM (), el resultado siempre será indicar un iPad.

Si se incluye este código y de destino OS 3.1.3 (el más reciente iPhone / iPod Touch OS) con el fin de probar su código de aplicación universal con destino a iPhone, obtendrá errores de compilación ya que los símbolos no están definidos en 3.1. 3 o anterior, cuando se compila para iPhone simulador 3.1.3.

Si este es el recomendado por Apple enfoque de tiempo de ejecución dispositivo de detección, lo que estoy haciendo mal? Nadie ha tenido éxito usando este enfoque de dispositivo de detección?

¿Fue útil?

Solución

Lo hago para obtener el código para compilar tanto en 3.1.3 y 3.2:

BOOL iPad = NO;
#ifdef UI_USER_INTERFACE_IDIOM
iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
#endif
if (iPad) {
// iPad specific code here
} else {
// iPhone/iPod specific code here
}

También escribió una publicación rápida sobre ello aquí: http: // www. programbles.com/2010/04/03/compiling-conditional-code-in-universal-iphone-ipad-applications/

Otros consejos

Esto es lo que yo uso:

- (BOOL) amIAnIPad {
    #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200)
        if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)])
            return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
    #endif
    return NO;
}

Este condicionalmente compila, por lo que aún puede construir para la sim 3,0. A continuación, comprueba para ver si las responde clase UIDevice al selector. Si alguno de ellos falla, no es un iPad.

  

Si este es el método recomendado por Apple para tiempo de ejecución   dispositivo de detección, lo que estoy haciendo mal? Alguien ha tenido éxito usando   este enfoque de dispositivo de detección de?

Esta es la solución para runtime detección:

#define isIPhone (![[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] || [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)

Después de que se puede probar fácilmente en cualquier lugar en el código:

if (isIPhone) { ... }

La diferencia entre esto y usando #if / #ifdef es que esta es la prueba de tiempo de ejecución, mientras que #if es la prueba de tiempo de compilación.

Creo que la prueba de tiempo de ejecución es mejor, porque se puede utilizar uno exigible para cualquier versión del sistema operativo en este caso. Si usted utiliza el cheque en tiempo de compilación, que necesita para producir diferentes ejecutables para diferentes versiones del sistema operativo.

Si el problema es los errores en tiempo de compilación, sólo debe compilar contra la última versión del SDK (véase también Cómo acceder débil marco vinculado en iOS? ).

Creo que la respuesta es simplemente no intente ejecutar el código en el iPhone simulador 3.1.3 o anterior. Siempre compilar con un SDK 3.2. El simulador de iPhone 3.2 le conseguirán el simulador de iPad o iPhone compilar para dispositivos 3.2 y poner la aplicación en un teléfono para probarlo.

No hay manera de compilar contra el 3.2 SDK y utilizar un simulador 3.1.3 o anterior.

En lugar de alguna utilidad cosas que a base del compilador:

- (BOOL)deviceIsAnIPad {
if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)])
    //We can test if it's an iPad. Running iOS3.2+
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
        return YES; //is an iPad
    else 
        return NO; //is an iPhone
else 
    return NO; //does not respond to selector, therefore must be < iOS3.2, therefore is an iPhone
}

Declarar el uso de este

#ifdef UI_USER_INTERFACE_IDIOM
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD false
#endif

a continuación, utilizar cheque como abajo

#define DetailLabel_PosX (IS_IPAD ? 200 : 160)

También se definen algunos para comprobar iPhone 5

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define IOS_OLDER_THAN_6 ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0 )
#define IOS_NEWER_OR_EQUAL_TO_6 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0 )
  

Esto parece vencer por completo el propósito de tal función a. Ellos   sólo puede ser compilado y ejecutado en el iPhone   OS 3.2 (iPhone OS 3.2 sólo se puede ejecutar   en el iPad). Así que si se puede usar   UI_USER_INTERFACE_IDIOM (), el resultado   será siempre para indicar un iPad.

Esto es completamente incorrecto. Puede ser compilado en la Base SDK de 3,2, pero puede ser Ejecutar en cualquier sistema operativo, si se establece el destino de despliegue adecuadamente.

UI_USER_INTERFACE_IDIOM () y UIUserInterfaceIdiomPad se puede utilizar en iOS3.2 y hacia arriba, la parte importante es la 'hacia arriba'. Seguro. iOS3.2 es sólo para iPad, pero iOS4.0 y más allá de ejecución en ambos iPhones y iPads, así que el cheque no es tan inútil como usted piensa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top