web-dev-qa-db-fra.com

UIScreen MainScreen Bounds retournant une taille incorrecte

J'ai donc créé un nouveau projet avec la dernière version de XCode et j'ai essayé de consigner la taille d'écran de mon application (pour déterminer le type d'appareil pour l'interface utilisateur). J'ai exécuté le code suivant à partir de mon iPhone 5:

NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);

Cela a renvoyé 480, qui est la taille d'écran de l'ancienne famille d'iPhone. J'ai essayé dans le simulateur et la même chose s'est produite. Y a-t-il une propriété que je dois activer dans le projet pour qu'il reconnaisse la taille de l'écran?

Cela ne se produit que pour 5+ appareils; si je lance le jeu sur mon iPad, il reconnaît la taille d'écran de 1024.

Je sais pertinemment que ce code a fonctionné dans le passé. J'ai fait un jeu il y a quelque temps en utilisant exactement la même méthode et il n'a eu aucun problème pour détecter la taille de l'écran, mais cela a été construit dans XCode 4.x.

Information additionnelle:

J'utilise un contrôleur de vue personnalisé, que je crée dans le délégué d'application avec le code suivant:

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

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    if([Global getDevice] == 1)
    {
        //iPhone 5+
        self.window.rootViewController = [[FivePlus alloc] initWithNibName:nil bundle:nil];

    }
    else if([Global getDevice] == 2)
    {
        //iPhone 4S-
        self.window.rootViewController = [[FourSMinus alloc] initWithNibName:nil bundle:nil];
    }
    else
    {
        //iPad
        self.window.rootViewController = [[iPad alloc] initWithNibName:nil bundle:nil];
    }

    [[self window] makeKeyAndVisible];

    // Override point for customization after application launch.
    return YES;
}

La méthode getDevice de Global.h:

+ (int)getDevice
{
if([[UIScreen mainScreen] bounds].size.height == 568 || [[UIScreen mainScreen] bounds].size.width == 568)
    {
        return 1;
    }
    else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        return 3;
    }
    else
    {
        return 2;
    }
}
40
David

Apparemment, iOS s'appuie niquement sur la présence d'une image de lancement dans la résolution d'un iPhone 5+ pour permettre à l'application de fonctionner dans cette résolution.

Il y a deux solutions pour ce problème:

1. Utiliser les catalogues d'actifs

Lorsque vous créez un nouveau projet, il y a ce qu'on appelle un catalogue d'actifs qui stocke vos fichiers d'image de lancement. Ajoutez-en un à votre projet et hop!

2. Détruisez d'anciens fichiers

Si vous connaissez XCode depuis un certain temps, vous saurez que dans l'une des versions ultérieures de XCode 4.x, l'application a automatiquement créé trois fichiers d'image de lancement par défaut pour votre application, appelés Default.png, [email protected], et [email protected]. Vous avez besoin de ces fichiers dans votre application, qui sont essentiellement des images noires avec les résolutions 480x320, 960x640, et 1136x640, respectivement (notez que ceux-ci sont en HxL, pas en LxH).

  1. Ajoutez ces fichiers à votre groupe "Fichiers de support"
  2. Accédez aux propriétés du projet et sélectionnez "Ne pas utiliser les catalogues d'actifs" dans la section Lancer l'image
  3. Supprimez le catalogue d'actifs.

Espérons que cela aide quelqu'un d'autre qui rencontre ce problème ridicule.

102
David

iOS fait souvent "semblant" de savoir quelle taille d'écran vous avez. Apple suppose par exemple que si vous n'avez pas la bonne image de lancement pour une certaine résolution, alors vous n'avez pas conçu votre application pour fonctionner correctement dans cette résolution, donc elle exécutera votre application dans une taille différente. Dans un cas extrême, une application iPhone uniquement exécutée sur un iPad retournera 320 x 480.

En ce qui concerne votre application, la taille d'écran indiquée est la taille d'écran disponible pour votre application. S'il indique 320 x 480, c'est ce que votre application peut utiliser. Tout ce qui est dessiné en dessous de 480 pixels ne sera pas visible.

Vous convainquez iOS d'exécuter votre application dans la résolution que vous souhaitez par exemple en fournissant une image de lancement à la bonne taille. Dans le cas de l'iPhone 6 et 6+, l'utilisateur peut les exécuter en mode "Zoom" afin qu'ils se comportent comme s'ils avaient l'écran d'un iPhone 5 ou 6 (juste physiquement plus grand).

2
gnasher729

Dans XCode6, l'absence d'image de démarrage pour la taille d'écran iPhone5 déclenchera un avertissement. XCode en ajoutera un par défaut (tout simplement noir) si vous appuyez sur l'avertissement.

Cela activera la taille "normale" du simulateur.

1
Jasper

Dans iOS 8 [[UIScreen mainScreen] bounds].size.height); retourne quelque chose d'inversé que l'appareil soit en mode vertical ou paysage.

1
Nicolas Manzini