negra - iphone no enfoca
Detecta la pantalla de la retina/iPhone 4 en iPhone SDK (11)
En mi aplicación, estoy descargando algunas imágenes de la web (desde mi servidor para ser precisos), para guardar un poco de ancho de banda y especialmente la memoria en el teléfono, las proporciono en dos resoluciones: 480x320 para la "antigua" serie de iPhone y en 960x640 para el iPhone 4 con pantalla retina. Ahora necesito poder detectar desde dentro de la aplicación cuando se ejecuta en un dispositivo que admite la pantalla de retina. ¿Cómo podría hacer eso?
He estado pensando en usar el fragmento de código a continuación que me devolvería un identificador de dispositivo específico como, por ejemplo, "iPhone3", aún así, estaría limitando la detección al iPhone4 y necesitaría actualizar ese código para cualquier dispositivo posterior con una pantalla de retina.
size_t size;
// Set ''oldp'' parameter to NULL to get the size of the data
// returned so we can allocate appropriate amount of space
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
// Allocate the space to store name
char *name = malloc(size);
// Get the platform name
sysctlbyname("hw.machine", name, &size, NULL, 0);
// Place name into a string
NSString *machine = [NSString stringWithCString:name];
¿Hay alguna mejor soution (tal vez sea muy obvio pero lo extrañé)?
Acabo de leer un poco sobre los foros oficiales de desarrolladores de Apple y los problemas se han discutido en detalle allí. La mejor manera para mí parece ser el uso de la propiedad de scale
de UIScreen
. Aunque solo está disponible en iOS 4
y iOS 4
posteriores, le dirá todo lo que necesita saber y lo más probable es que desempeñe un papel aún más importante en el futuro (ya notó que la resolución de pantalla de 1024x768 del iPad es exactamente 32/15 * 480x320 ?).
UIScreen.mainScreen.scale
Si tienes otra idea, siéntete libre de publicarla :)
Aquí hay un código para hacerlo de la manera correcta para iOS 3.xy 4.x:
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
hasHighResScreen = YES;
}
}
Aunque ya ha seleccionado una respuesta, hay una manera mucho más fácil cuando se trata específicamente de imágenes, así que lo mencionaré también.
Si incluye dos imágenes en su paquete de los dos tamaños (320x480 y 640x960) y agrega "@ 2x" al final del nombre de archivo de la última imagen, [UIImage imageNamed:] seleccionará automáticamente la imagen más pequeña para dispositivos más antiguos y la 2x para dispositivos con una pantalla retina, siempre que omita el sufijo de la imagen. Ex.:
2 imágenes llamadas @ "image.png" y @ "[email protected]", ambas incluidas en el paquete de la aplicación.
Luego llame:
[UIImage imageNamed:@"image"];
Así es como funcionan los íconos de la aplicación y la pantalla de carga.
Obtengo el tamaño real de la pantalla (en píxeles) de esta manera:
UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
Si está utilizando Cocos2d, intente lo siguiente:
[[CCDirector sharedDirector] winSizeInPixels];
Se devolverá un CGSize
con propiedades de width
y height
.
Una pequeña actualización sobre la respuesta de Scott Gustafson:
Si necesitamos distinguir entre iPad / Retina / iphone:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0)
{
//iPad retina screen
}
else
{
//iPad screen
}
}
else
{
if ([UIScreen instancesRespondToSelector:@selector(scale)])
{
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0)
{
if([[ UIScreen mainScreen ] bounds ].size.height == 568)
{
//iphone 5
}
else
{
//iphone retina screen
}
}
else
{
//iphone screen
}
}
}
Ve con la respuesta de Robin. Otra nota: si necesita verificar el nombre del dispositivo, solo use los métodos en UIDevice.
[[UIDevice currentDevice] model];
[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];
Y para aquellos que solo quieren copiar / pegar cómo detectar iphone / iphone_retina / ipad / ipad_retina, esto es lo que terminé haciendo después de leer este hilo. Muy inspirado por la contribución de Guntis Treulands, quien a su vez amplió la respuesta de Scott Gustafsons.
- (NSString *) yesButWhichDeviceIsIt {
BOOL hasRetina = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
hasRetina = YES;
}
}
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
if (hasRetina) {
return @"iPad retina";
} else {
return @"iPad";
}
} else {
if (hasRetina) {
return @"iPhone retina";
} else {
return @"iPhone";
}
}
}
+(BOOL)Retina{
return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0; }
- (BOOL)isRetina {
BOOL isRetina = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
isRetina = YES;
}
}
return isRetina;
}
- (CGSize)sizeInPixels {
CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
CGSize screenSize = CGSizeMake(appFrame.size.width, appFrame.size.height);
return [self isRetina] ? CGSizeMake(screenSize.width * 2, screenSize.height * 2) : screenSize;
}
UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size