sucia negra linterna fotos enfoca camara borrosas anda iphone cocoa-touch iphone-4

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