¿Cómo se puede obtener UI_USER_INTERFACE_IDIOM() para trabajar con iPhone OS SDK<3.2
ipad iphone-sdk-3.2 (8)
Esto parece derrotar completamente el propósito de tal función. Solo se pueden compilar y ejecutar en iPhone OS 3.2 (iPhone OS 3.2 solo se puede ejecutar en iPad). Entonces, si puede usar UI_USER_INTERFACE_IDIOM (), el resultado siempre será indicar un iPad.
Esto es completamente incorrecto Se puede compilar en Base SDK de 3.2, pero se puede ejecutar en cualquier sistema operativo, si configura el destino de implementación de forma adecuada.
Apple recomienda 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 derrotar completamente el propósito de tal función. Solo se pueden compilar y ejecutar en iPhone OS 3.2 (iPhone OS 3.2 solo se puede ejecutar en iPad). Entonces, si puede usar UI_USER_INTERFACE_IDIOM (), el resultado siempre será indicar un iPad.
Si incluye este código y se dirige a OS 3.1.3 (el sistema operativo más reciente de iPhone / iPod Touch) para probar el código universal de su aplicación para iPhone, obtendrá errores de compilación ya que los símbolos no están definidos en 3.1.3 o anterior , al compilar para el simulador de iPhone 3.1.3.
Si este es el enfoque recomendado por Apple para la detección de dispositivos en tiempo de ejecución, ¿qué estoy haciendo mal? ¿Alguien ha tenido éxito al usar este enfoque para la detección de dispositivos?
Si este es el enfoque recomendado por Apple para la detección de dispositivos en tiempo de ejecución , ¿qué estoy haciendo mal? ¿Alguien ha tenido éxito al usar este enfoque para la detección de dispositivos?
Esta es la solución para la detección en tiempo de ejecución :
#define isIPhone (![[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] || [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
Después de eso, puedes probarlo fácilmente en cualquier lugar de tu código:
if (isIPhone) { ... }
La diferencia entre esto y el uso de #if / #ifdef es que esta es una prueba de tiempo de ejecución, mientras que #if es una prueba en tiempo de compilación.
Creo que la prueba de tiempo de ejecución es mejor, porque en este caso puedes usar un exacto para cualquier versión del sistema operativo. Si utiliza la verificación en tiempo de compilación, deberá producir diferentes ejecutables para diferentes versiones del sistema operativo.
Si su problema son los errores en tiempo de compilación, solo debe compilar contra la última versión de SDK (consulte también ¿Cómo acceder al marco débil vinculado en iOS? ).
Creo que la respuesta es simplemente no intente ejecutar el código en el simulador de iPhone 3.1.3 o anterior. Siempre compila con un 3.2 SDK. El simulador de iPhone 3.2 te ofrecerá el simulador de iPad, o compilará para iPhone Device 3.2 y pondrá la aplicación en un teléfono para probarlo.
No hay forma de compilar contra 3.2 SDK y usar un simulador 3.1.3 o anterior.
Declarar usando esto
#ifdef UI_USER_INTERFACE_IDIOM
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD false
#endif
luego use el control como se muestra a continuación
#define DetailLabel_PosX (IS_IPAD ? 200 : 160)
También hay algunos definir para verificar 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 )
En lugar de cualquier cosa basada en el compilador que uso:
- (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
}
Esto es lo que uso:
- (BOOL) amIAnIPad {
#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200)
if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)])
return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
#endif
return NO;
}
Esto compila de forma condicional, por lo que aún puede compilar para el sim 3.0. Luego verifica si la clase UIDevice responde al selector. Si cualquiera de estos falla, no es un iPad.
Hago esto para obtener el código para compilar tanto en 3.1.3 como en 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 escribí una publicación rápida en el blog aquí: http://www.programbles.com/2010/04/03/compiling-conditional-code-in-universal-iphone-ipad-applications/
UI_USER_INTERFACE_IDIOM () y UIUserInterfaceIdiomPad se pueden utilizar en iOS3.2 y versiones posteriores, la parte más importante es el ''hacia arriba''. Por supuesto. iOS3.2 es solo para iPad, pero iOS4.0 y versiones posteriores se ejecutan tanto en iPhones como en iPads, por lo que el control no es tan inútil como piensas.