web-dev-qa-db-fra.com

Comment développer ou migrer des applications pour la résolution d'écran de l'iPhone 5?

Le nouvel écran de l'iPhone 5 présente un nouveau rapport de format et une nouvelle résolution (640 x 1136 pixels).

Que faut-il pour développer de nouvelles applications ou faire la transition d'applications existantes vers la nouvelle taille d'écran?

Que devrions-nous garder à l'esprit pour rendre les applications "universelles" à la fois pour les anciens écrans et pour le nouveau format d'image large?

495
Lukasz
  1. Téléchargez et installez la dernière version de Xcode .
  2. Définissez un fichier d'écran de lancement pour votre application (dans l'onglet Général de vos paramètres de cible). Voici comment utiliser la taille complète de n’importe quel écran, y compris la taille des vues fractionnées sur iPad sous iOS 9.
  3. Testez votre application et, espérons-le, ne faites rien d'autre, car tout devrait fonctionner comme par magie si vous aviez défini les masques de redimensionnement automatique correctement ou utilisé la mise en forme automatique.
  4. Si ce n'est pas le cas, ajustez la disposition de vos vues, de préférence avec la disposition automatique.
  5. S'il y a quelque chose que vous devez faire spécifiquement pour les écrans plus grands, alors il semblerait que vous deviez vérifier la hauteur de [[UIScreen mainScreen] bounds] car il semble qu'il n'y ait pas d'API spécifique pour cela. Depuis iOS 8, il existe également des classes de taille qui synthétisent les tailles d’écran de manière régulière ou compacte verticalement et horizontalement et qui sont recommandées pour adapter votre interface utilisateur.
479
Filip Radelic

Si vous avez une application conçue pour iPhone 4S ou une version antérieure, elle s'exécutera sous letterbox sur iPhone 5.

Pour adapter votre application au nouvel écran plus grand, la première chose à faire est de changer l’image de lancement en: [email protected]. Sa taille devrait être 1136x640 (HxW). Oui, il est essentiel de laisser l'image par défaut dans la nouvelle taille d'écran pour permettre à votre application d'exploiter l'intégralité de l'écran du nouvel iPhone 5 .

(Notez que la convention de dénomination ne fonctionne que pour l'image par défaut. Nommer une autre image "[email protected]" ne la chargera pas à la place de "[email protected] ". Si vous devez charger différentes images pour différentes tailles d’écran, vous devrez le faire par programme.)

Si vous êtes très chanceux, c'est peut-être ça ... mais selon toute probabilité, vous devrez faire quelques pas de plus.

  • Assurez-vous que vos Xibs/Views utilisent la mise en page automatique pour se redimensionner.
  • Utilisez des ressorts et des entretoises pour redimensionner les vues.
  • Si cela ne convient pas à votre application, concevez votre xib/storyboard pour une taille d'écran spécifique et repositionnez-le par programme pour l'autre.

Dans le cas extrême (lorsque rien de ce qui précède ne suffit), concevez les deux fichiers Xib et chargez le fichier approprié dans le contrôleur de vue.

Pour détecter la taille de l'écran:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    if(result.height == 568)
    {
        // iPhone 5
    }
}
116
Sanjay Chaudhry

La seule chose vraiment nécessaire à faire est d'ajouter une image de lancement nommée "[email protected]" aux ressources de l'application, et dans le cas général (si vous avez la chance, l'application fonctionnera correctement).

Si l'application ne gère pas les événements tactiles, assurez-vous que la fenêtre de la clé a la taille appropriée. La solution de contournement consiste à définir le cadre approprié:

[window setFrame:[[UIScreen mainScreen] bounds]]

Il existe d'autres problèmes non liés à la taille de l'écran lors de la migration vers iOS 6. Lisez Notes de version iOS 6. pour plus de détails.

30
onegray

Parfois (pour les applications pré-storyboard), si la disposition est suffisamment différente, il est utile de spécifier un xib différent en fonction de l'appareil (voir cette question - vous devrez modifier le code pour pouvoir traiter avec l'iPhone 5) dans le viewController init, car aucune quantité de twiddling avec des masques de réduction de la taille automatique ne fonctionnera si vous avez besoin de graphismes différents.

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    NSString *myNibName;
    if ([MyDeviceInfoUtility isiPhone5]) myNibName = @"MyNibIP5";
    else myNibName = @"MyNib";

    if ((self = [super initWithNibName:myNibName bundle:nibBundleOrNil])) {


...

Ceci est utile pour les applications qui ciblent les anciennes versions iOS.

22
SomaMan

Vous trouverez ici un didacticiel Nice (pour MonoTouch, mais vous pouvez également utiliser les informations relatives aux projets Non-MonoTouch):
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/

  1. Créez une nouvelle image pour votre écran de démarrage/par défaut ( 640 x 1136 pixels ) avec le nom " par défaut-568h @ 2x.png "

  2. Dans le simulateur iOS , accédez au menu Matériel -> Périphérique, puis sélectionnez " iPhone (Retina 4-inch) ) "

  3. Créez d'autres images, par exemple images de fond

  4. Détectez l'iPhone 5 pour charger vos nouvelles images:

public static bool IsTall
{
    get {
        return UIDevice.currentDevice.userInterfaceIdiom
                    == UIUserInterfaceIdiomPhone
                && UIScreen.mainScreen.bounds.size.height
                    * UIScreen.mainScreen.scale >= 1136;
    }
}

private static string tallMagic = "-568h@2x";
public static UIImage FromBundle16x9(string path)
{
    //adopt the -568h@2x naming convention
    if(IsTall())
    {
        var imagePath = Path.GetDirectoryName(path.ToString());
        var imageFile = Path.GetFileNameWithoutExtension(path.ToString());
        var imageExt = Path.GetExtension(path.ToString());
        imageFile = imageFile + tallMagic + imageExt;
        return UIImage.FromFile(Path.Combine(imagePath,imageFile));
    }
    else
    {
        return UIImage.FromBundle(path.ToString());
    }
}
20
Manni

Il est facile de migrer iPhone5 et iPhone4 via XIBs .........

UIViewController *viewController3;
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
    UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone5screen" bundle:nil] autorelease];               
}    
else
{
     UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone4screen" bundle:nil] autorelease];
}
13
shankar

Je résous ce problème ici . Ajoutez simplement ~ 568h @ 2x suffixe aux images et ~ 568h à xib. Pas besoin de plus de contrôles d'exécution ou de modifications de code.

12
Shimanski Artem

J'avais ajouté la nouvelle image de lancement par défaut et (en vérifiant plusieurs autres réponses SE ...), je m'assurais que mes story-boards étaient tous auto-dimensionnés et sous-vues, mais que la rétine avait encore une boîte aux lettres de 4 pouces.

Ensuite, j'ai remarqué que mon pli d'info avait un élément de campagne pour "image de lancement" défini sur "Default.png", que j'avais ainsi supprimé et que le format "letterboxing" magique n'apparaissait plus. J'espère que cela sauvera quelqu'un d'autre de la même folie que j'ai enduré.

10
SkeletonJelly

Pour déterminer si votre application peut prendre en charge l’iPhone 5 Retina, utilisez ceci: (Cela pourrait être plus robuste de renvoyer le type d’affichage, Retina 4S, etc. Oui ou non)

Dans un fichier ".h" commun, ajoutez:

BOOL IS_IPHONE5_RETINA(void);

Dans un fichier ".m" commun, ajoutez:

BOOL IS_IPHONE5_RETINA(void) {
    BOOL isiPhone5Retina = NO;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        if ([UIScreen mainScreen].scale == 2.0f) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960){
                //NSLog(@"iPhone 4, 4s Retina Resolution");
            }
            if(result.height == 1136){
                //NSLog(@"iPhone 5 Resolution");
                isiPhone5Retina = YES;
            }
        } else {
            //NSLog(@"iPhone Standard Resolution");
        }
    }
    return isiPhone5Retina;
}
9
Mike

Dans un fichier constants.h, vous pouvez ajouter les instructions suivantes:

 #define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad 
 #define IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
 #define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON) 
 #define IS_IPHONE_5 (!IS_IPAD && IS_WIDESCREEN)
9
K S

Je suppose que cela ne fonctionnera pas dans tous les cas, mais dans mon projet particulier cela m'a évité la duplication de fichiers NIB:

Quelque part dans common.h, vous pouvez définir ces définitions en fonction de la hauteur de l'écran:

#define HEIGHT_IPHONE_5 568
#define IS_IPHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5)

Dans votre contrôleur de base:

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (IS_IPHONE_5) {
        CGRect r = self.view.frame;
        r.size.height = HEIGHT_IPHONE_5 - 20;
        self.view.frame = r;
    }
    // now the view is stretched properly and not pushed to the bottom
    // it is pushed to the top instead...

    // other code goes here...
}
9
iutinvg

Tout d’abord, créez deux xibs et attachez tous les délégués, classe principale à la xib, puis vous pourrez indiquer la condition mentionnée ci-dessous dans votre fichier appdelegate.m dans

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

    if ([[UIScreen mainScreen] bounds].size.height == 568)
        {

        self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone5" bundle:nil];
        }

        else
        {
             self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone4" bundle:nil];

        }

vous pouvez l'utiliser n'importe où dans le programme en fonction de vos besoins, même dans vos classes ViewController. Ce qui compte le plus, c’est que vous avez créé deux fichiers xib séparés pour iphone 4(320*480) and iphone 5(320*568).

8
mandeep

Essayez la méthode ci-dessous dans une classe singleton:

-(NSString *)typeOfDevice
    {
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            if(result.height == 480)
            {
                return @"Iphone";
            }
            if(result.height == 568)
            {
                return @"Iphone 5";
            }
        }
        else{
            return @"Ipad";;
        }


        return @"Iphone";
    }
7
Mohammed Ebrahim

La vérification de bounds avec 568 échouera en mode paysage. L'iPhone 5 ne se lance qu'en mode portrait, mais si vous souhaitez prendre en charge les rotations, l'iPhone 5 "check" devra également gérer ce scénario.

Voici une macro qui gère l'état d'orientation:

#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))

L'utilisation de l'appel 'preferredMode' provient d'un autre message que j'ai lu il y a quelques heures et je ne suis donc pas venu avec cette idée.

7
Christopher

Vous pouvez utiliser la fonction Auto Layout et créer le design à l'aide de la résolution d'écran de l'iPhone 5; cela fonctionnera pour les appareils 4 "et 3,5", mais dans ce cas, vous devez avoir une connaissance suffisante du gestionnaire de disposition.

7
DeveshM

Je n'ai jamais rencontré un problème de ce type avec aucun appareil, car j'ai une base de code pour tous, sans aucune valeur codée en dur. Ce que je fais est d'avoir l'image de taille maximale en tant que ressource au lieu d'une pour chaque périphérique. Par exemple, j’en aurais un pour l’affichage de la rétine et le montrerais comme un ajustement d’aspect afin que ce soit une vue telle quelle sur chaque appareil. Venir à décider du cadre du bouton, par exemple, au moment de l'exécution. Pour cela, j'utilise la valeur% de la vue brevet, par exemple, si je veux que la largeur soit égale à la moitié de la vue parent, prenons 50% de celle du parent et qu'il en va de même pour la hauteur et le centre.

Avec cela, je n'ai même pas besoin des xibs.

6
infiniteLoop

Montrez d'abord cette image. Sur cette image, vous affichez un avertissement pour le support Retina 4, alors cliquez sur cet avertissement, puis sur Ajouter pour que votre écran de démarrage Retina 4 ajoute automatiquement votre projet.

Show image here

et après avoir utilisé ce code:

if([[UIScreen mainScreen] bounds].size.height == 568)
    {
        // For iphone 5
    }
    else
    {
        // For iphone 4 or less
    }
6
Darshan Kunjadiya

Vous pouvez utiliser cette définition pour calculer si vous utilisez l'iPhone 5 en fonction de la taille de l'écran:

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

utilisez ensuite une simple instruction if:

    if (IS_IPHONE_5) {

    // What ever changes
    }
5
Mutawe

Peter, vous devriez vraiment jeter un coup d'œil à Canappi, il fait tout pour vous, il vous suffit de spécifier la mise en page en tant que telle:

button mySubmitButton 'Sumbit' (100,100,100,30 + 0,88,0,0) { ... }

À partir de là, Canappi générera le code objectif-c correct qui détecte le périphérique sur lequel l'application est exécutée et utilisera:

(100,100,100,30) for iPhone4
(100,**188**,100,30) for iPhone 5

Canappi fonctionne à la fois comme Interface Builder et Story Board, sauf qu’il se présente sous forme textuelle. Si vous avez déjà des fichiers XIB, vous pouvez les convertir afin de ne pas avoir à recréer l'interface utilisateur complète à partir de zéro.

4
metaprogrammer

Vous pouvez vérifier manuellement la taille de l'écran pour déterminer le périphérique sur lequel vous vous trouvez:

#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)

float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
    // 4"

} else {

    // 3"

}
4
Robot1987

Ceci est un vrai code universel, vous pouvez créer 3 story-board différents:

Définissez votre projet en mode universel et définissez votre iPhone principal avec le storyboard iPhone5 et le principal iPad avec storyboard cible iPad, ajoutez maintenant une nouvelle cible de storyboard pour iphone et modifiez la résolution pour iphone 4s ou moins, appliquez maintenant votre AppDelegate. m

iPhone4/4s (identique pour les 3/3Gs) un pour iPhone5 et rendre le projet niversel, avec une nouvelle cible Storyboard pour iPad, maintenant dans à AppDelegate.m sous la didFinishLaunching ajoutez ce code:

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

Vous avez donc créé une application universelle pour iPhone 3/3Gs/4/4s/5 Tous les types d’iPod et Tous les types d’iPad

N'oubliez pas d'intégrer tous les IMG avec myImage.png et [email protected]

3
BlackSheep

Vous pouvez ajouter ce code:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960) {
                NSLog(@"iPhone 4 Resolution");
            }
            if(result.height == 1136) {
              NSLog(@"iPhone 5 Resolution");
            }
        }
        else{
            NSLog(@"Standard Resolution");
        }
    }
3
dbramhall

Selon moi, la meilleure façon de traiter de tels problèmes et d’éviter certaines conditions nécessaires au contrôle de la hauteur du périphérique consiste à utiliser le cadre relatif pour les vues ou tout élément de l’interface utilisateur que vous ajoutez à votre vue, par exemple: si vous ajoutez certains éléments de l'interface utilisateur que vous souhaitez voir situés au bas de la vue ou juste au-dessus de la barre d'onglets doivent alors prendre l'origine y en ce qui concerne la hauteur de votre vue ou la barre d'onglets (le cas échéant); nous avons également une propriété de redimensionnement automatique. J'espère que cela fonctionnera pour vous

2
Pranav Bhardwaj

Si vous devez convertir une application déjà existante en application universelle, vous devez sélectionner le fichier xib correspondant -> afficher les utilitaires -> Afficher l'inspecteur de taille.

Dans l'inspecteur de taille, vous pouvez voir le redimensionnement automatique. À l'aide de cet outil, vous pouvez convertir en application iOS existante.

1
Prad

Plutôt que d'utiliser un ensemble de conditions, vous pouvez redimensionner automatiquement l'affichage en utilisant la taille de l'écran.

int h = [[UIScreen mainScreen] bounds].size.height;
int w = [[UIScreen mainScreen] bounds].size.width;
self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100));

Dans mon cas, je veux une vue qui remplisse l'espace entre certains champs de saisie en haut et certains boutons en bas, donc fixe le coin supérieur gauche et la variable en bas à droite en fonction de la taille de l'écran. Mon application remplit la vue avec la photo prise par l'appareil photo, alors je veux tout l'espace que je peux obtenir.

1
Charles Jaimet

À l’aide de xCode 5, sélectionnez "Migrer vers le catalogue d’actifs" dans Projet> Général.

Utilisez ensuite "Afficher dans le Finder" pour trouver votre image de lancement. Vous pouvez l’éditer en 640x1136, puis faites-la glisser dans le catalogue d’actifs, comme indiqué dans l’image ci-dessous.

Assurez-vous que les sections iOS7 et iOS6 R4 ont une image de 640x1136. La prochaine fois que vous lancerez l'application, les barres noires disparaîtront et votre application utilisera un écran de 4 pouces.

enter image description here

0
Alex Stone

Il y a un léger problème lors des tests sur les appareils iOS et iOS Simulator. Il semble que le simulateur (XCode 6.0.1) donne les valeurs commutées pour la largeur et la hauteur dans [[UIScreen mainScreen] bounds].size en fonction de l'orientation du périphérique.

Cela peut donc poser un problème pour déterminer la bonne taille d'écran physique. Ce code permet également de distinguer toutes les générations de modèles 2014.:

  • iphone 4s
  • iPhone5 (et iPhone5s)
  • iPhone6 ​​(et iPhone6 ​​+)

Il peut également être facilement modifié pour faire la distinction entre, par exemple. iPhone6 ​​d'iPhone6 ​​+.

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

    CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
    {
        if (iOSDeviceScreenSize.width > 568 || // for iOS devices
            iOSDeviceScreenSize.height > 568) // for iOS simulator
        {   // iPhone 6 and iPhone 6+

            // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone6
            storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil];

            NSLog(@"loaded iPhone6 Storyboard");
        }
        else if (iOSDeviceScreenSize.width == 568 || // for iOS devices
                 iOSDeviceScreenSize.height == 568) // for iOS simulator
        {   // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured)

            // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone5
            storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];

            NSLog(@"loaded iPhone5 Storyboard");
        }
        else
        {   // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured)

                // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
            storyboard = [UIStoryboard story    boardWithName:@"MainStoryboard_iPhone" bundle:nil];

                NSLog(@"loaded iPhone4 Storyboard");
        }
    }
    else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {   // The iOS device = iPad

        storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPadnew" bundle:nil];

        NSLog(@"loaded iPad Storyboard");
    }

    // rest my code
}
0
vedrano

Je suggérerais d’utiliser Autoresizing Mask dans vos applications en fonction de votre interface d’interface utilisateur, ce qui évite beaucoup de problèmes et est préférable à la création d’une interface utilisateur différente pour les écrans d’iPhone 4 et 5.

0
Geet

Utilisez la fonction Auto Layout pour les vues. Il s'ajustera automatiquement à toutes les résolutions.

Créez deux xibs pour un contrôleur ayant le nom du contrôleur avec le suffixe ~ iphone ou ~ ipad. Au moment de la compilation, Xcode prendra le bon fichier xib en fonction du périphérique.

Utilisez des classes de taille si vous souhaitez créer un seul fichier xib pour iPhone et iPad, si la vue est suffisamment simple pour être transférée sur iPhone et iPad.

0
Praveen Matanam

Avis intéressant - dans le nouveau Xcode, vous devez ajouter ce fichier image [email protected] aux ressources.

0
Michal Gumny