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




xib ios (10)

  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 :-)

\

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:

se ve en iphone-5. Hay un espacio debajo de los botones:

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.

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


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);
}

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

Descubrí que agregar la imagen de inicio [email protected] 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.


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

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

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


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
}

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


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.


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.


  • En su guión gráfico, haga clic en "Mostrar inspector de archivos".
  • En Documento de compilador 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 .





interface-builder