ventajas que pantalla iphone ios4 retina-display

iphone - que - Detectar la pantalla de la retina



pantalla de retina ventajas (14)

Aquí hay una extensión rápida y práctica:

extension UIScreen { public func isRetina() -> Bool { return screenScale() >= 2.0 } public func isRetinaHD() -> Bool { return screenScale() >= 3.0 } private func screenScale() -> CGFloat? { if UIScreen.mainScreen().respondsToSelector(Selector("scale")) { return UIScreen.mainScreen().scale } return nil } }

Uso:

if UIScreen.mainScreen().isRetina() { // your code }

¿IOS SDK proporciona una manera fácil de verificar si el dispositivo actual tiene una pantalla de alta resolución (retina)?

La mejor manera que he encontrado para hacerlo ahora es:

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) { // RETINA DISPLAY }


Este es un riff en la respuesta de Matt MC arriba. Sólo una categoría en UIScreen .

#import "UIScreen+Util.h" @implementation UIScreen (Util) + (BOOL) isRetinaDisplay { static BOOL retina = NO; static BOOL alreadyChecked = NO; if (!alreadyChecked) { UIScreen *mainScreen = self.mainScreen; if (mainScreen) { retina = mainScreen.scale > 1.0; alreadyChecked = YES; } } return retina; } @end


Este fragmento ...

int d = 0; // standard display if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) { d = 1; // is retina display } if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { d += 2; }

Volverá ... 0 para resolución estándar iPhone / iPod touch, 1 para retina iPhone, 2 para resolución estándar iPad, 3 para retina iPad.


Esto funciono para mi

if((UIScreen .mainScreen().scale) < 2.0) { NSLog("no retina"); } else { NSLog("retina"); }


La respuesta de @ sickp es correcta. Solo para facilitar las cosas, agregue esta línea en su archivo Shared.pch:

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale >= 2.0))

Entonces en cualquier archivo puedes simplemente hacer:

if(IS_RETINA) { // etc.. }


Para detectar la pantalla Retina de forma confiable en todos los dispositivos iOS, debe verificar si el dispositivo está ejecutando iOS4 + y si la [UIScreen mainScreen].scale es igual a 2.0. NO PUEDES asumir que un dispositivo está ejecutando iOS4 + si existe la propiedad de scale , ya que el iPad 3.2 también contiene esta propiedad.

En un iPad con iOS3.2, la escala devolverá 1.0 en modo 1x, y 2.0 en modo 2x, aunque sabemos que el dispositivo no contiene una pantalla Retina. Apple cambió este comportamiento en iOS4.2 para el iPad: devuelve 1.0 en modo 1x y 2x. Puedes probarlo tú mismo en el simulador.

-displayLinkWithTarget:selector: el -displayLinkWithTarget:selector: en la pantalla principal que existe en iOS4.x pero no en iOS3.2, y luego verifico la escala de la pantalla:

if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0)) { // Retina display } else { // non-Retina display }



Siempre es un poco peligroso comparar los valores de punto flotante para la igualdad. Prefiero ir para cualquiera

[UIScreen mainScreen].scale > 1.0;

o

[UIScreen mainScreen].scale < 2.0;


Solo para combinar la respuesta de @sickp y el siguiente comentario de @ n13, convertí esto en una categoría de UIScreen que parece funcionar bien. La comprobación se realiza la primera vez que la llama y luego se guarda para llamadas posteriores.

@interface UIScreen (RetinaCheck) + (BOOL)retinaScreen; @end static BOOL isRetinaScreen = NO; static BOOL didRetinaCheck = NO; @implementation UIScreen (RetinaCheck) + (BOOL)retinaScreen { if (!didRetinaCheck) { isRetinaScreen = ([[self mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([self mainScreen].scale == 2.0)); didRetinaCheck = YES; } return isRetinaScreen; } @end

Podría ser útil para alguien.


Versión modificada de primulaveris para simplificar la mayoría de los casos de uso comunes. Estoy en Swift 2.2 pero no debería importar.

extension UIScreen { static var isRetina: Bool { return screenScale >= 2.0 } static var isRetinaHD: Bool { return screenScale >= 3.0 } static var screenScale:CGFloat { return UIScreen.mainScreen().scale } }

Entonces simplemente úsalos así

print(UIScreen.isRetina) print(UIScreen.isRetinaHD) print(UIScreen.screenScale)


Versión rápida de las respuestas anteriores, con una escala> = 2.0, por lo que incluye iPhone 6+ y otros dispositivos futuros con una escala superior a Retina:

if UIScreen.mainScreen().respondsToSelector(Selector("scale")) && UIScreen.mainScreen().scale >= 2.0 { // code executed only on Retina device }


prueba esto

if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0)) { // Retina display NSLog(@"---------------Retina display"); } else { // non-Retina display NSLog(@"---------------non-Retina display"); }


+(BOOL)iPhoneRetina{ return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0; }


// .h UIKIT_EXTERN bool isRetinaDisplay(); // .m bool isRetinaDisplay() { static bool flag; #ifdef __BLOCKS__ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { flag = [[UIScreen mainScreen] scale] > 1.0; } else { flag = false; } }); #else static bool onceToken; if(onceToken == false) { onceToken = true; if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { flag = [[UIScreen mainScreen] scale] > 1.0; } else { flag = false; } } #endif return flag; }