2012-10-02 24 views
8

Mis aplicaciones tienen una funcionalidad adicional para el iPhone 5, y he creado una clase separada con .xib para ello. Me gustaría detectar la altura de la pantalla (a menos que sea posible obtener el ID/modelo del dispositivo) y cargar un controlador de vista diferente en consecuencia. He intentado esto:Cargando una xib diferente para el iPhone 5

- (IBAction)select:(id)sender { 

CGRect screenRect = [[UIScreen mainScreen] bounds]; 
CGFloat screenWidth = screenRect.size.width; 
CGFloat screenHeight = screenRect.size.height; 

if (screenHeight == 960) { 

Selection *selectView =[[Selection alloc] initWithNibName:nil bundle:nil]; 
selectView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
[self presentModalViewController:selectView animated:YES]; 

} 

else { 

    Selection_5 *selectView =[[Selection_5 alloc] initWithNibName:nil bundle:nil]; 
    selectView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
    [self presentModalViewController:selectView animated:YES]; 

} 

} 

Selección y Selection_5 son dos clases diferentes, cada uno con un xib diferente para la interfaz de usuario.

+0

Sí, funcionó. Solía ​​flotador ScreenHeight = [UIScreen mainScreen] .bounds.size.height –

+0

Ésta es la ayuda a resolver este problema http://stackoverflow.com/questions/13275144/how-to-make-xib-compatible- with-both-iphone-5-and-iphone-4-devices/13283851 # 13283851 –

Respuesta

5

tratar http://github.com/erica/uidevice-extension/

[[UIDevice currentDevice] platformType] // ex: UIDevice4GiPhone 
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G" 

o puede simplemente ver ScreenHeight como:

float screenHeight = [UIScreen mainScreen].bounds.size.height; 

para la altura iPhone 5 es 568

y tal vez Shell para establecer la semilla si se carga con un .xib como:

[[Selection alloc] initWithNibName:@"here_is_nibname" bundle:nil]; 
+0

Gracias, usando float screenHeight = [UIScreen mainScreen] .bounds.size.height funcionó. –

+0

en modo horizontal, no puedo obtener el ancho exacto del dispositivo. Por favor, cualquiera comparta cómo obtener ... – Karthik

+0

en el paisaje que necesita para comparar no con la altura 568, pero con el ancho 568. –

8

En primer lugar, no desea verificar por tipo de dispositivo. ¿Qué pasaría con los nuevos toques de iPod (que tienen la misma pantalla de tamaño) o el iPhone del próximo año?

Pero creo que el problema aquí es que está comprobando el tamaño de la pantalla en función de la cantidad real de píxeles que, curiosamente, no es lo que desea. Recuerde que en una pantalla Retina todo está "duplicado". En la interfaz de usuario, usas (principalmente) el tamaño "normal" para todo lo que, en este caso, es la mitad del número de píxeles.

En resumen: compruebe una altura de pantalla de 480 (normal) o 568 (iPhone 5).

+0

Ah, finalmente obtengo lo que era el 568 haciendo referencia! Estoy usando eso para cargar un xib diferente para los dispositivos de 4 " –

5

En mi aplicación tengo que cargar un archivo .xib para iPhone, iPhone5/iPod Touch y iPad, por eso, este es el código que utilizo:

// If Iphone/iPod Touch 
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
    // If iPhone 5 or new iPod Touch 
    if([UIScreen mainScreen].bounds.size.height == 568){ 
    VCDadosViewController *extratoVC = [[VCDadosViewController alloc] initWithNibName:@"VCDadosViewControllerExt" bundle:nil]; 
    ... 
    } else{ 
    // Regular iPhone 
    VCDadosViewController *extratoVC = [[VCDadosViewController alloc] initWithNibName:@"VCDadosViewController" bundle:nil]; 
    ...   
    } 
// If iPad 
} else { 
    VCDadosViewController *extratoVC = [[VCDadosViewController alloc] initWithNibName:@"VCDadosViewControllerPad" bundle:nil]; 
    ... 
} 

espero que ayude a alguien que necesita :)

3

Si usted tiene esta convención

VGArticlePage~ipad.xib 
VGArticlePage~iphone.xib 
VGArticlePage~iphone_ext.xib 

A continuación, puede hacer como esto

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f) 

- (NSString *)nibNameForClass:(Class)class 
{ 
    if(IS_IPHONE && IS_IPHONE_5) 
    { 
     return [NSString stringWithFormat:@"%@%@", NSStringFromClass(class), @"~iphone_ext"]; 
    } 
    else if(IS_IPHONE) 
    { 
     return [NSString stringWithFormat:@"%@%@", NSStringFromClass(class), @"~iphone"]; 
    } 
    else 
    { 
     return [NSString stringWithFormat:@"%@%@", NSStringFromClass(class), @"~ipad"]; 
    } 
} 
+0

Si el método nibNameForClass se coloca como una función estática en una clase Util, podría usarse en todas partes en la aplicación. Prefiero esto sobre la solución de gmogames. – Zuppa

Cuestiones relacionadas