42 votes

xcode 4.5 comment choisir les storyboards au lancement

J'essaie de faire fonctionner mon application avec l'iPhone 5 et l'iPhone 4/4s. J'ai essayé "AutoLayout" mais il ne semble pas fonctionner pour mon application et j'ai lu qu'il n'est pas supporté dans iOS 5. AutoLayout échoue spécifiquement sur un contrôleur de vue qui a un UIScrollview et un UIPicker qui est redimensionné dans le code. Avoir deux Storyboards, l'un pour 4 pouces et l'autre pour 3,5 pouces semble être la solution.

L'approche des deux storyboards semble être la solution pour moi. Il me reste donc deux questions ;

  1. Où doit aller le code permettant de détecter s'il s'agit d'un 4/4/5 ? Je suppose que dans le appDelegate.m dans la méthode didFinishLaunchingWithOptions

  2. Comment modifier le "Main Storyboard" ?

61voto

fields.cage Points 805

C'est une excellente question.

Ce qu'il faut faire, c'est

  1. Sélectionnez votre storyboard 4/4s actuel, allez dans Fichier, dupliquez-le, puis donnez-lui un nom spécifique à l'iPhone 5. Assurez-vous que la case Target et le nom de votre application sont cochés.

  2. Ensuite, vous devez sélectionner les scènes dans votre storyboard et, dans l'inspecteur d'attributs, changer la taille en Retina 4 Full Screen. Cela vous permet de tout réorganiser pour cet affichage.

  3. Enfin, dans l'application didFinishLaunchingWithOptions, collez le code suivant avec le nom du storyboard que vous avez donné à votre storyboard de 4 pouces.

    - (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 vous ne comprenez pas comment procéder à l'étape 1, procédez comme suit.

  1. Allez dans le répertoire du projet et copiez-collez le fichier MainStoryboard.storyboard et renommez le nouveau storyboard comme suit MainStoryboard5.storyboard .

  2. Ajouter ce nouveau storyboard MainStoryboard5.storyboard dans le projet (dans Xcode) en cliquant avec le bouton droit de la souris sur Projet et en cliquant sur Add Files to ....

  3. Nous avons maintenant deux storyboards dans xcode.

Conseil

Il se peut que vous deviez utiliser "Produit > Nettoyer" pour que cela fonctionne après avoir effectué toutes les opérations ci-dessus.

7voto

Leon Lucardie Points 3998

Actuellement, le seul moyen de vérifier si vous utilisez l'iPhone 5 est la fonction [UIScreen mainScreen] bounds] y [[UIScreen mainScreen] scale] .

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

Cela ne fonctionne que si vous avez au moins ajouté un Default-568h@2x.png L'image de lancement de l'application. Sinon, le résultat sera toujours faux. (Parce que l'écran sera letterboxed si vous n'avez pas l'image de lancement)

Pour adapter le storyboard à votre version de l'iPhone 5, vous pouvez consulter la page suivante cette question

2voto

Tanos Points 49

Je me suis inspiré de la réponse de fields.cage et l'ai adaptée à mon code, cela fonctionne bien. Merci !

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

1voto

Nelson Brian Points 253

Ce que j'ai fait récemment, c'est ajouter une déclaration de définition dans toutes les classes dont j'ai besoin pour vérifier le dispositif. Cela peut également être fait dans n'importe quel fichier d'en-tête global.

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

Le test bool est tiré de Détecter l'écran de l'iphone 5 4 .

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

Cette méthode fonctionne parfaitement si vous utilisez déjà des story-boards et que vous souhaitez uniquement modifier le storyboard par rapport aux valeurs par défaut de votre projet pour les appareils iPhone 5. Si vous partez de zéro avec un projet existant sans storyboard, vous pouvez procéder de cette manière.

#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]; 
}

Lorsque je démarre un projet, je conçois la version 3.5" de l'iPhone dans des storyboards (si j'utilise des storyboards), puis lorsque j'ai terminé cette conception, je vais dans mes fichiers de projet et je trouve le fichier storyboard. Puisqu'un fichier storyboard n'est qu'un fichier de mise en page XML, je peux prendre ce fichier et le charger dans mon éditeur de texte favori et changer deux balises.

Convertir iPhone en iPad

  1. En haut du fichier, vous trouverez targetRuntime="iOS.CocoaTouch "
  2. Passer à targetRuntime="iOS.CocoaTouch.iPad"
  3. Au bas du fichier, vous trouverez peut-être ceci <simulatedScreenMetrics key="destination" type="retina4"/>
  4. Remplacer par <simulatedScreenMetrics key="destination"/>

Le dernier point n'apparaîtra que si le fichier principal du storyboard est configuré pour l'écran 4" de l'iPhone.

Ce qui est important ici, c'est que si vous ne faites qu'ajouter l'iPhone 5 à un projet existant, vous n'avez besoin que de la première vérification pour remplacer la valeur par défaut et charger votre fichier storyboard spécial. Cela m'a littéralement évité d'avoir à agencer manuellement tous les objets en code pour l'iPhone 5.

0voto

Jhon Points 581

Le premier fonctionne très bien, il est simple et clair, mais pour tous ceux qui veulent intégrer plusieurs appareils, regardez ici :

  1. Créer un projet pour l'iPhone5 avec un Storyboard nommé iPhone5_Storyboard.

  2. Fermer l'application et à l'intérieur d'un dossier cloner le fichier Main Story appelé iPhone5_Storyboard et renommez-le en iPhone4_Storyboard sans oublier de changer la taille et de réorganiser tous les objets dans xcode interface builder.

  3. Facultatif si vous voulez une version universelle, dans xcode utilisez Add File et ajouter une nouvelle cible Storyboard EMPTY pour l'iPad, ouvrir un iphone5_storyboard utiliser CMD+A et copier tout et coller dans la cible Empty Story pour iPad (il faut réorganiser les objets, mais tout est lié et fonctionne).

  4. Dans Xcode, sous TARGET, réglez Universal App et sous MainStoryboard, réglez iPhone5_Storyboard, sous iPad Main Story, réglez iPad_Storyboard.

  5. Maintenant GRÂCE À UNE PREMIÈRE RÉPONSE DE CE POSTE nous devons mettre en œuvre toutes les différentes histoires en utilisant ce code à l'intérieur d'un fichier 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;
 }` 

Nous avons maintenant une application universelle pour iPhone 3/3Gs/4/4s/5 iPod (AllGen) iPad 1/2/3/4 Mini et Retina

Merci les gars

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X