web-dev-qa-db-fra.com

xcode 4.5 comment choisir des storyboards au lancement

Essayer de faire fonctionner mon application avec l'iPhone 5 et l'iPhone 4/4s. J'ai essayé le "AutoLayout" mais ne semble pas fonctionner pour mon application également lu qu'il n'est pas pris en charge dans iOS 5. AutoLayout échoue spécifiquement sur un contrôleur de vue qui a un UIScrollview et un UIPicker qui est redimensionné en code. Avoir deux Storyboards un pour 4 pouces et un pour 3,5 pouces semble la voie à suivre.

Les deux approches du Storyboard semblent être la solution pour moi. Cela me laisse donc deux questions;

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

  2. Comment changer le "Storyboard principal"?

42
Xaphann

C'est une excellente question.

Ce que vous devez faire, c'est

  1. Sélectionnez votre storyboard 4/4s actuel, allez dans Fichier, dupliquez, puis donnez-lui un nom spécifique à l'iPhone 5. Assurez-vous que 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é pour votre storyboard 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 quelqu'un ne sait pas comment faire l'étape 1, faites comme ci-dessous.

  1. Accédez au répertoire Project et copiez collez le MainStoryboard.storyboard et renommer le nouveau storyboard pour dire MainStoryboard5.storyboard.

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

  3. Nous avons maintenant deux storyboards en xcode.

Astuce

Vous devrez peut-être utiliser "Produit> Nettoyer" pour que cela fonctionne après avoir fait tout ce qui précède.

61
fields.cage

Actuellement, la seule façon de vérifier si vous utilisez l'iPhone 5 est le [UIScreen mainScreen] bounds] et [[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 [email protected] lancer l'image sur votre application. Sinon, cela retournera toujours faux. (Parce que l'écran sera en boîte aux lettres si vous n'avez pas l'image de lancement)

Pour définir le storyboard sur votre version iPhone 5, vous voudrez peut-être jeter un œil à cette question

7
Leon Lucardie

Je me suis inspiré de la réponse de fields.cage et l'ai adapté à mon code, cela fonctionne très 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];
        }
    }
2
Tanos

Ce que j'ai fait récemment, c'est d'ajouter une instruction define dans toutes les classes dont j'ai besoin pour vérifier l'appareil. 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éen provient de écran Détecter 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];
}

Cela fonctionne à merveille si vous utilisez déjà des storyboards , et que vous ne souhaitez modifier le storyboard que par défaut avec lequel votre projet a commencé pour les appareils iPhone 5. Si vous partez de zéro avec un projet non Storyboard existant, vous pouvez le faire de cette façon.

#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 maintenant, je conçois la version iPhone 3.5 "dans des storyboards (si j'utilise des storyboards), puis quand j'en ai fini avec ce design, je vais dans mes fichiers de projet et je trouve le fichier de storyboard. Puisqu'un fichier de storyboard est juste un Fichier de disposition XML, je peux prendre ce fichier et le charger dans mon éditeur de texte préféré et changer deux balises.

Convertir l'iPhone en iPad

  1. En haut du fichier, trouvez targetRuntime="iOS.CocoaTouch "
  2. Passez à targetRuntime="iOS.CocoaTouch.iPad"
  3. Annoncez le bas du fichier, vous pouvez trouver cela <simulatedScreenMetrics key="destination" type="retina4"/>
  4. Changez ceci en <simulatedScreenMetrics key="destination"/>

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

Ce qui est important ici, c'est que si vous ajoutez uniquement 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 de storyboard spécial. Cela m'a littéralement évité d'avoir à mettre en page manuellement tous les objets dans le code pour iPhone 5.

1
Nelson Brian

Le premier Work très bon est simple et clair, mais pour tous si vous souhaitez intégrer des appareils multipliés regardez ici:

  1. Créez un projet pour iPhone5 avec un Storyboard nommé iPhone5_Storyboard.

  2. Fermez l'application et à l'intérieur d'un dossier, clonez l'histoire principale appelée iPhone5_Storyboard et renommez-la en iPhone4_Storyboard sans oublier de changer la taille et de réorganiser tous les objets à l'intérieur du générateur d'interface xcode.

  3. Facultatif si vous voulez une version universelle, à l'intérieur de xcode utilisez Ajouter un fichier et ajoutez une nouvelle cible Storyboard EMPTY pour iPad, ope un iphone5_storyboard utilisez CMD + A et copiez tout et collez-le dans Story vide pour iPad (besoin de réorganiser l'objet, mais il est tout lié Et travaillant).

  4. Dans Xcode sous TARGET, définissez Universal App et définissez sous MainStoryboard votre iPhone5_Storyboard, sous iPad Main Story setting iPad_Storyboard.

  5. Maintenant MERCI À UNE PREMIÈRE RÉPONSE DE CE POST nous devons implémenter toutes les histoires différentes en utilisant ce code dans 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;
 }
</code>

Voilà, 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

0
BlackSheep