2012-09-21 21 views
42

Estoy tratando de hacer que mi aplicación funcione tanto con iPhone 5 como con iPhone 4/4s. Probé el "AutoLayout", pero parece que no funciona para mi aplicación, también he leído que no es compatible con iOS 5. AutoLayout falla específicamente en un controlador de vista que tiene un UIScrollview y un UIPicker que se vuelve a clasificar según el código. Tener dos Storyboards uno para 4 pulgadas y uno para 3.5 pulgadas parece ser el camino a seguir.xcode 4.5 cómo seleccionar guiones gráficos en el lanzamiento

Las dos aprobaciones de Storyboard parecen ser la solución para mí. Entonces esto me deja con dos preguntas;

  1. ¿Dónde debería detectarse el código si es un 4/4s/5 go? Supongo que en la aplicaciónDelegate.m en el método didFinishLaunchingWithOptions

  2. ¿Cómo cambio el "Guión gráfico principal"?

+0

También debe considerar el uso de resortes y puntales para cambiar el tamaño de su vista en lugar de duplicar su guión gráfico, especialmente si todo lo que está cambiando es el diseño. Podría conducir fácilmente a una solución mucho más fácil de mantener, y admitirá versiones anteriores de iOS. –

+0

Usando las respuestas proporcionadas, creé una categoría para hacer esto más fácil - https://gist.github.com/4003438 –

+0

no podría ser más fácil ... http://stackoverflow.com/a/13040627/294884 o http://stackoverflow.com/a/12799462/294884 – Fattie

Respuesta

61

Esta es una gran pregunta .

Lo que hay que hacer es,

  1. Seleccione su corriente 4/4s del guión gráfico, vaya a Archivo, duplicar, luego darle un nombre específico del iPhone 5. Asegúrate de que Target y el nombre de tu aplicación estén marcados.

  2. A continuación tiene que seleccionar las escenas en su guión gráfico y en el Inspector de Atributos, cambie el tamaño a Retina 4 Pantalla completa. Esto le permite reorganizar todo para esta pantalla.

  3. Finalmente en la aplicación didFinishLaunchingWithOptions pegue el siguiente código con el nombre del guión gráfico que dio para su guión gráfico de 4 pulgadas.

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ 
        UIStoryboard *storyBoard; 
    
        CGSize result = [[UIScreen mainScreen] bounds].size; 
        CGFloat scale = [UIScreen mainScreen].scale; 
        result = CGSizeMake(result.width * scale, result.height * scale); 
    
        if(result.height == 1136){ 
         storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_5" bundle:nil]; 
         UIViewController *initViewController = [storyBoard instantiateInitialViewController]; 
         [self.window setRootViewController:initViewController]; 
        } 
    } 
    
    return YES; 
    } 
    

Si alguien no consigue cómo hacer el paso 1, hacer como abajo.

  1. Ir al proyecto de directorio y copiar y pegar el MainStoryboard.storyboard y cambiar el nombre nuevo guión gráfico que decir MainStoryboard5.storyboard.

  2. Añadir este nuevo guión gráfico MainStoryboard5.storyboard en el proyecto (en Xcode) por el Proyecto clic derecho y haciendo clic Add Files to ....

  3. Ahora tenemos dos guiones gráficos en Xcode.

Consejo

Puede que tenga que utilizar 'Producto> Limpio' para que esto funcione después de haber hecho todo lo anterior.

+0

¡Funcionó muy bien! – Xaphann

+0

Gracias. Asegúrese de haber agregado su pantalla de bienvenida antes de ejecutar el proyecto :) – BigAppleBump

+0

Desarrollé recientemente otra aplicación y construí todo con la pantalla de 4 "en guiones gráficos. Cuando la ejecuto en pantallas de 3.5" todo se ajustará a esa pantalla si tiene sus elementos de UI anclados correctamente. Hubo una imagen de fondo que tuve que escribir una declaración if en una clase 'viewDidLoad que verificó el alto de la pantalla usando el código anterior. Esto cambió la imagen que apareció de acuerdo con el dispositivo actual para asegurar que la imagen no se vea borrosa cuando se muestra en pantallas de 3.5 " –

7

Actualmente la única manera es comprobar si está usando el iPhone 5 es la y [[UIScreen mainScreen] scale].

BOOL isIphone5 = (([[UIDevice currentDevice] userInterfaceIdiom] 
== UIUserInterfaceIdiomPhone) && (([UIScreen mainScreen].bounds.size.height * 
[[UIScreen mainScreen] scale]) >= 1136)); 

Esto solo funciona si al menos ha agregado una imagen de inicio [email protected] a su aplicación. De lo contrario, esto siempre será falso. (Debido a que se letterboxed la pantalla si usted no tiene la imagen lanzamiento)

Para establecer el guión gráfico de la versión de iPhone 5 es posible que desee echar un vistazo a this question

+0

+1 para la nota LaunchImage! –

2

Me inspiré en fields.cage answer y lo adapté a mi código, funciona bien. Gracias !!

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ 
     UIStoryboard *storyBoard; 

     CGSize result = [[UIScreen mainScreen] bounds].size; 
     CGFloat scale = [UIScreen mainScreen].scale; 
     result = CGSizeMake(result.width * scale, result.height * scale); 

     if(result.height == 1136){ 


      self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone5" bundle:nil] autorelease]; 

     } 
     else 
     { 
      self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease]; 
     } 
    } 
1

Lo que he estado haciendo recientemente es agregar una declaración definir en cualquier clase que necesite para verificar el dispositivo. Esto también se puede hacer en cualquier archivo de encabezado global.

#define IS_IPHONE (!IS_IPAD) 
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) 

La prueba es de bool Detect iphone 5 4" screen.

bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136)); 
if (isiPhone5) { 
     // Setup For iPhone 5 Screen Size 
    UIStoryboard *storyBoard; 

    storyBoard = [UIStoryboard storyboardWithName:@"MyiPhone5StoryboardName" bundle:nil]; 
    UIViewController *initViewController = [storyBoard instantiateInitialViewController]; 
    [self.window setRootViewController:initViewController]; 
} 

Esto funciona muy bien si ya está utilizando guiones gráficos, y sólo desea cambiar el guión gráfico de los valores predeterminados que su proyecto se inició con dispositivos para el iPhone 5. Si está empezando desde cero con un proyecto existente que no sea Storyboard, puede hacerlo de esta manera.

#define IS_IPHONE (!IS_IPAD) 
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) 

bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136)); 
if (isiPhone5) { 
     // Load iPhone 5 Storyboard 
    UIStoryboard *storyBoard; 

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil]; 
    UIViewController *initViewController = [storyBoard instantiateInitialViewController]; 
    [self.window setRootViewController:initViewController]; 
} 

else if (IS_IPAD) { 
     // Load IPAD StoryBoard 
    UIStoryboard *storyBoard; 

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; 
    UIViewController *initViewController = [storyBoard instantiateInitialViewController]; 
    [self.window setRootViewController:initViewController]; 
} 

else { 
     // Load the iPhone 3.5" storyboard 
    UIStoryboard *storyBoard; 

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
    UIViewController *initViewController = [storyBoard instantiateInitialViewController]; 
    [self.window setRootViewController:initViewController]; 
} 

Cuando comienzo un proyecto ahora yo diseño del iPhone versión 3.5" en guiones gráficos (si estoy usando guiones gráficos), a continuación, cuando haya terminado con ese diseño de entrar en mis archivos de proyecto y busque el archivo del guión gráfico. Desde un archivo de guión gráfico es simplemente un archivo del formato XML, puedo tomar ese archivo y cargarlo en mi editor de texto favorito y cambiar dos etiquetas.

Convertir iPhone al iPad

  1. en la parte superior del archivo de encontrar targetRuntime="iOS.CocoaTouch "
  2. Cambiar para targetRuntime="iOS.CocoaTouch.iPad"
  3. anuncio de la parte inferior del archivo que se puede encontrar este <simulatedScreenMetrics key="destination" type="retina4"/>
  4. Cambiar esto a <simulatedScreenMetrics key="destination"/>

El último elemento sólo aparecerá si el archivo principal del guión gráfico está configurado para la pantalla de iPhone de 4 ".

Lo que es importante aquí es que si solo agrega un iPhone 5 a un proyecto existente, solo necesita el primer cheque para anular el predeterminado y cargar su archivo especial del guión gráfico. Esto literalmente me salvó de tener que diseñar manualmente todos los objetos en el código para iPhone 5.

0

El primero de ellos trabajan muy bien es simple y clara, pero por todas si desea integrar dispositivos multiplican vistazo aquí:

  1. crear un proyecto para iPhone5 con un guión gráfico llamado iPhone5_Storyboard.

  2. Cerrar la aplicación y dentro de una carpeta clonar el principal historia llamada iPhone5_Storyboard y renombrar en que iPhone4_Storyboard se olvide de cambiar el tamaño y cambiar el orden de todos los objetos en el interior constructor de interfaces Xcode.

  3. opcional si quieres una versión universal, dentro de utilización Xcode Agregar archivo y añadiendo nuevo objetivo VACÍO Storyboard para IPAD, opa ONU uso iphone5_storyboard CMD + A y copiar todo y pegar en el vacío Historia de IPAD (necesidad reordenar objeto, pero está todo vinculado y funcionando).

  4. En Xcode bajo TARGET configure la Aplicación universal y la configuración bajo MainStoryboard usted iPhone5_Storyboard, bajo la configuración de iPad Main Story iPad_Storyboard.

  5. Ahora gracias a una primera respuesta de este post tenemos que implementar toda historia diferente que utiliza este código dentro de un AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ 
     UIStoryboard *storyBoard; 

     CGSize result = [[UIScreen mainScreen] bounds].size; 
     CGFloat scale = [UIScreen mainScreen].scale; 
     result = CGSizeMake(result.width *scale, result.height *scale); 

//----------------HERE WE SETUP FOR IPHONE4/4s/iPod---------------------- 

     if(result.height == 960){ 
      storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil]; 
      UIViewController *initViewController = [storyBoard instantiateInitialViewController]; 
      [self.window setRootViewController:initViewController]; 
     } 

//----------------HERE WE SETUP FOR IPHONE3/3s/iPod---------------------- 

     if(result.height == 480){ 
      storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil]; 
      UIViewController *initViewController = [storyBoard instantiateInitialViewController]; 
      [self.window setRootViewController:initViewController]; 
     } 
    } 

     return YES; 
} 

Eso es todo ahora tenemos una aplicación universal para iPhone 3/3Gs/4/4s/5 iPod (AllGen) iPad 1/2/3/4 Mini y Retina

Gracias muchachos

Cuestiones relacionadas