Cómo hacer que xib sea compatible con dispositivos iPhone 5 y iPhone 4

Estoy tratando de diseñar mi xib para que el diseño se adapte tanto al iphone 5 (4 pulgadas de retina) como a los 3.5 dispositivos.

Como tengo que admitir IOS-5, no puedo usar el diseño automático. Tengo que usar resortes y Struts.

Intenté todo en Interface-Builder. Pero mi punto de vista va más allá de la parte inferior de iphone-3.5-inch o no llena completamente la retina iphone-4-inch.

¿Alguien puede dar una pista sobre cómo hacer que un xib sea compatible con ambos dispositivos?

Para mayor claridad, agrego capturas de pantalla:

Cuando configuro el tamaño 3.5 en el inspector de atributos: Cuando establezco el tamaño en el inspector de atributos a 3.5

se ve en iphone-5. Hay un espacio debajo de los botones: Y así es como se ve en el simulador para dispositivos de 3.5 pulgadas

Si configuro un tamaño de 4 pulgadas en el constructor de interfaz. Puede ver que los botones inferiores no son visibles en iphone-4. Si configuro un tamaño de 3.5 pulgadas en el constructor de interfaces

Entonces preguntarás cuáles son las configuraciones que estoy usando. Aquí están ellos:

enter image description hereenter image description hereenter image description here

  1. Agrega una nueva categoría para UIviewController y agrega este código en el archivo .h

    - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil; 
  2. Agregue este código en su archivo .m

      - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil { if (self = [super init]) { self = [self initWithNibName:[self CheckDeviceIphone4:nibNameOrNil4 Iphone5:nibNameOrNil5 Ipad:nibNameOrNilpad] bundle:nibBundleOrNil]; } return self; } -(NSString *)CheckDeviceIphone4:(NSString *)iphone4 Iphone5:(NSString *)iphone5 Ipad:(NSString *)ipad { return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ? ipad :([[UIScreen mainScreen] bounds].size.height == 568) ? iphone5 :iphone4; } 
  3. Abra el archivo YouProject-Prefix.pch e importe su categoría aquí

  4. ahora solo usas esto en todo proyecto como este

      self.firstView=[[firstView alloc]initWithNibNameforIphone4:@"firstView4" NibNameforIphone5:@"firstView" NibNameforIpad:@"firstViewIpad" bundle:[NSBundle mainBundle]]; 

    Gracias y cualquier pregunta, luego comenten y no olviden votar 🙂

\

Intente agregar esto a todos sus controladores que necesitan ser compatibles con iPhone 5:

 - (void) loadView { [super loadView]; self.view.frame = [UIScreen mainScreen].bounds; } 

Simplemente configure el tamaño de vista en Ninguno usando el Constructor de interfaz
Tomará el tamaño de la vista en tiempo de ejecución, solo debe tener en cuenta el origen y el autosizing para cada elemento (UILabel, UIImage, etc.) en la vista.

  • Interface-builder (XIB) -> Attribute Inspector -> Simulated Metrics – Size: None

enter image description here

Estuve luchando con esto hoy, y no importaba lo que hiciera, mis puntos de vista siempre se mostraban como 320×480, incluso cuando se ejecutaba en el simulador de retina de 4 “. Incluso [UIScreen mainScreen] .bounds devolvía 320×480!

Descubrí que agregar la imagen de inicio Default-568h@2x.png era la clave para que iOS reconociera mi aplicación como ‘retina 4’ lista ‘. Una vez que lo hice, descubrí que no tenía que hacer nada más para que los plumines dimensionaran automáticamente sin las barras negras. No es necesario tener dos xibs por separado, cambiar las configuraciones en Interface Builder, anular loadView, etc.

No necesita usar una punta diferente para los dispositivos de 3.5 pulgadas y 4 pulgadas. Diseña la aplicación para el dispositivo de 4 pulgadas y configura la AutoResizingMask correctamente y debería funcionar correctamente.

En su caso, simplemente configure AutoResizingMask para

 [view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth]; 

La máscara de aumento automático coloca la vista correctamente en su posición en ambos dispositivos.

Si vas con la solución de usar 2 archivos xib; en su método initWithNibName () simplemente realice una llamada a super con el nombre de punta diferente.

Probaría la dimensión de altura 480 original en lugar de la altura 568 para que el archivo xib más grande se seleccione cuando Apple lanza una pantalla más grande. En el futuro, al menos el xib más grande no será en forma de buzón tanto como el más pequeño.

 // From MainView.m - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { CGSize result = [[UIScreen mainScreen] bounds].size; if(result.height == 480) { // iPhone Classic self = [super initWithNibName:@"MainView" bundle:nibBundleOrNil]; } else { // iPhone 5 or maybe a larger iPhone ?? self = [super initWithNibName:@"MainView5" bundle:nibBundleOrNil]; } return self; } 

Tengo una idea. Deje que su UI se separe en encabezado, cuerpo y pie de página (como el sitio web). Luego, en la consola de códigos, localice en Size Inspector y use Autosizing.

Observe las líneas exteriores del cuadrado, es su ubicación de control contra la vista principal. Configure los controles (barra de navegación, UIImageView, UIButton, etc.) en la parte del encabezado y la parte del cuerpo unida a la parte superior y los controles (marcador, cierre, etc.) en el pie de página a la parte inferior.

Cada vez que corres, los controles se adjuntarán a sus ajustes de autosizing. Tendrás un espacio entre el encabezado / cuerpo y el pie de página en el iPhone 5, pero creo que está bien.

Defina la línea inferior y verifique la condición según el dispositivo.

 #define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) 
  if (IS_IPHONE_5) {
     btnBookmark.frame = CGRectMake (0, 460, 100, 70);
     btnBookmark.frame = CGRectMake (150, 460, 100, 70);
 }
 else {
     btnBookmark.frame = CGRectMake (0, 360, 100, 70);
     btnBookmark.frame = CGRectMake (150, 360, 100, 70);
 }

También tenía un problema con 3.5 “vs. 4”, y entendí mal lo que estaba mal, así que quise documentarlo aquí en caso de que ayude a alguien.

Si intenta acceder a self.view.frame , no se informará correctamente hasta viewDidAppear o algún evento similar. Si intenta acceder a self.view.frame desde viewDidLoad se le pueden informar las dimensiones del marco antes de que se lleve a cabo la autosizing.

  • En su guión gráfico, haga clic en “Mostrar inspector de archivos”.
  • En Documento de comstackdor de interfaz-> Versiones de documento, seleccione Implementación = iOS 5 (o su elección).

Si esto no funciona, debe trabajar con cada una de sus vistas. Seleccionarlos. En el inspector de atributos para cada uno de ellos, en la sección Ver, consulte el atributo de modo. Establecer esto en ‘Redraw’.

Si incluso eso no da resultados satisfactorios, configure el tamaño de vista a la más pequeña de todas las versiones que va a usar. Y configure el atributo de modo = ‘Escalar para llenar’.

Programáticamente, el atributo Mode es la propiedad view.contentmode .

Sin usar el autolayout, es posible que necesite manejar muchas cosas en el código. Supongo que la mayor parte de su diseño puede funcionar bien con resortes y puntales, pero algunos elementos de la interfaz de usuario no pueden, por lo tanto, configurar manualmente los marcos de ciertos objetos de acuerdo con el tamaño de su vista es necesario.

El fragmento de ivanzoid que se encuentra encima de las consultas para todo el tamaño de la pantalla es el truco, siempre que recuerde restar los desplazamientos para la navegación y las barras de herramientas (totalizando 64 en la mayoría de las condiciones).

Es la altura de la vista lo que debe ajustarse; resortes y puntales de lo contrario se ocupan de ello.

Volviendo a probar mi aplicación en el iPhone 5 solo tuve que hacer esto en una pantalla con algunos ajustes de posición de control de tiempo de ejecución. Todos los demás casos son manejados por XIB por defecto.

Si no quieres usar dos xib y está interesado en hacer uso del Autosizing aquí

Si su UI es demasiado complicada y contiene demasiados UIControls, entonces le sugiero que haga lo siguiente en viewDidLoad ():

 NSLog(@"Iphone %f ",[[UIScreen mainScreen] bounds].size.height); if ([[UIScreen mainScreen] bounds].size.height == 568) { //design frames of your controls accordingly add add the controls as subview to self.view //this is iphone 5 xib } else { //design frames of your controls accordingly add add the controls as subview to self.view // this is iphone 4 xib }