102 votes

Xcode 5 et Asset Catalog : Comment référencer le LaunchImage ?

J'utilise le catalogue d'actifs de Xcode 5 et j'aimerais utiliser mon catalogue d'actifs. LaunchImage comme image d'arrière-plan de ma vue d'accueil (une pratique assez courante pour que la transition entre "chargement" et "chargé" soit fluide).

Je voudrais utiliser la même entrée dans le catalogue d'actifs pour gagner de l'espace et ne pas avoir à reproduire l'image dans deux jeux d'images différents.

Cependant, appeler :

UIImage *image = [UIImage imageNamed:@"LaunchImage"]; //returns nil

83voto

Pichirichi Points 456

Voici la liste (presque) complète des LaunchImage (à l'exception des images iPad sans barre d'état) :

  • LaunchImage-568h@2x.png
  • LaunchImage-700-568h@2x.png
  • LaunchImage-700-Landscape@2x~ipad.png
  • LaunchImage-700-Paysage~ipad.png
  • LaunchImage-700-Portrait@2x~ipad.png
  • LaunchImage-700-Portrait~ipad.png
  • LaunchImage-700@2x.png
  • LaunchImage-Landscape@2x~ipad.png
  • LaunchImage-Landscape~ipad.png
  • LaunchImage-Portrait@2x~ipad.png
  • LaunchImage-Portrait~ipad.png
  • LaunchImage.png
  • LaunchImage@2x.png
  • LaunchImage-800-667h@2x.png (iPhone 6)
  • LaunchImage-800-Portrait-736h@3x.png (iPhone 6 Plus Portrait)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus Paysage)
  • LaunchImage-1100-Portrait-2436h@3x.png (Portrait de l'iPhone X)
  • LaunchImage-1100-Landscape-2436h@3x.png (iPhone X Paysage)

0 votes

Quelqu'un connaît les images de l'iPad sans barre d'état ?

1 votes

@Mohamed Hafez : Pichirichi les a effectivement inclus dans sa liste. Ce sont LaunchImage-Portrait~ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape~ipad.png, et LaunchImage-Landscape@2x~ipad.png.

0 votes

Que signifient les chiffres 700 et 800 ?

53voto

JosephH Points 21074

Les LaunchImages sont spéciales, et ne sont pas réellement un catalogue d'actifs sur l'appareil. Si vous regardez en utilisant iFunBox/iExplorer/etc (ou sur le simulateur, ou dans le répertoire de construction), vous pouvez voir les noms finaux, et ensuite écrire du code pour les utiliser - par exemple, pour un projet iPhone-only iOS7, cela va définir la bonne image de lancement :

NSString *launchImage;
if  ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) &&
     ([UIScreen mainScreen].bounds.size.height > 480.0f)) {
    launchImage = @"LaunchImage-700-568h";
} else {
    launchImage = @"LaunchImage-700";
}

[self.launchImageView setImage:[UIImage imageNamed:launchImage]];

J'ai mis ça dans viewDidLoad.

Ce n'est pas vraiment l'idéal, ce serait génial si Apple nous donnait une belle API pour le faire.

2 votes

Cela a fonctionné pour moi, mais j'aimerais vraiment qu'il y ait un moyen plus simple de référencer l'image de lancement.

0 votes

Peut-être corrigé dans Xcode 5.0.2 - voir ci-dessous, semble fonctionner pour moi simplement pour faire référence à "LaunchImage.png".

1 votes

@Adam J'aimerais beaucoup que ce soit vrai ! Je viens d'essayer sur iphone5s/xcode5.0.2/ios7.0.4, [UIImage imageNamed:@"LaunchImage.png"] me donne zéro.

27voto

nonamelive Points 1960

Mon application ne prend actuellement en charge que l'iOS 7 et les versions ultérieures.

C'est ainsi que je référence l'image de lancement à partir du catalogue d'actifs :

NSDictionary *dict = @{@"320x480" : @"LaunchImage-700",
                       @"320x568" : @"LaunchImage-700-568h",
                       @"375x667" : @"LaunchImage-800-667h",
                       @"414x736" : @"LaunchImage-800-Portrait-736h"};
NSString *key = [NSString stringWithFormat:@"%dx%d",
    (int)[UIScreen mainScreen].bounds.size.width,
    (int)[UIScreen mainScreen].bounds.size.height];
UIImage *launchImage = [UIImage imageNamed:dict[key]];

Vous pouvez ajouter d'autres paires clé-valeur si vous souhaitez prendre en charge des versions plus anciennes d'iOS.

1 votes

Notez qu'à partir d'iOS 8, UIScreen.mainScreen.bounds est différent selon l'orientation actuelle de l'interface. Voir stackoverflow.com/a/24153540/158525

1 votes

Merci pour cela, exactement ce que je cherchais !

0 votes

Merci pour cette information, y a-t-il une méthode pour accéder aux icônes de l'application ?

7voto

zaheer Points 406

Je viens d'écrire une méthode générale pour obtenir le nom de l'image splash pour l'iPhone et l'iPad (Landscape, Portrait), ça a marché pour moi, j'espère que ça vous aidera aussi. J'ai écrit ceci avec l'aide d'autres réponses de SO, merci @Pichirichi pour toute la liste.

+(NSString*)getLaunchImageName
{

 NSArray* images= @[@"LaunchImage.png", @"LaunchImage@2x.png",@"LaunchImage-700@2x.png",@"LaunchImage-568h@2x.png",@"LaunchImage-700-568h@2x.png",@"LaunchImage-700-Portrait@2x~ipad.png",@"LaunchImage-Portrait@2x~ipad.png",@"LaunchImage-700-Portrait~ipad.png",@"LaunchImage-Portrait~ipad.png",@"LaunchImage-Landscape@2x~ipad.png",@"LaunchImage-700-Landscape@2x~ipad.png",@"LaunchImage-Landscape~ipad.png",@"LaunchImage-700-Landscape~ipad.png"];

UIImage *splashImage;

if ([self isDeviceiPhone])
{
    if ([self isDeviceiPhone4] && [self isDeviceRetina])
    {
        splashImage = [UIImage imageNamed:images[1]];
        if (splashImage.size.width!=0)
            return images[1];
        else
            return images[2];
    }
    else if ([self isDeviceiPhone5])
    {
        splashImage = [UIImage imageNamed:images[1]];
        if (splashImage.size.width!=0)
            return images[3];
        else
            return images[4];
    }
    else
        return images[0]; //Non-retina iPhone
}
else if ([[UIDevice currentDevice] orientation]==UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown)//iPad Portrait
{
    if ([self isDeviceRetina])
    {
        splashImage = [UIImage imageNamed:images[5]];
        if (splashImage.size.width!=0)
            return images[5];
        else
            return images[6];
    }
    else
    {
        splashImage = [UIImage imageNamed:images[7]];
        if (splashImage.size.width!=0)
            return images[7];
        else
            return images[8];
    }

}
else
{
    if ([self isDeviceRetina])
    {
        splashImage = [UIImage imageNamed:images[9]];
        if (splashImage.size.width!=0)
            return images[9];
        else
            return images[10];
    }
    else
    {
        splashImage = [UIImage imageNamed:images[11]];
        if (splashImage.size.width!=0)
            return images[11];
        else
            return images[12];
    }
 }
}

D'autres méthodes utilitaires sont

+(BOOL)isDeviceiPhone
{
 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
 {
     return TRUE;
 }

 return FALSE;
}

+(BOOL)isDeviceiPhone4
{
 if ([[UIScreen mainScreen] bounds].size.height==480)
    return TRUE;

 return FALSE;
}

+(BOOL)isDeviceRetina
{
 if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
    ([UIScreen mainScreen].scale == 2.0))        // Retina display
 {
    return TRUE;
 } 
 else                                          // non-Retina display
 {
     return FALSE;
 }
}

+(BOOL)isDeviceiPhone5
{
 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && [[UIScreen mainScreen] bounds].size.height>480)
 {
    return TRUE;
 }
 return FALSE;
}

0 votes

Il y a en fait un léger bug dans ce code pour isDeviceiPhone4 : [[UIScreen mainScreen] bounds] change maintenant en fonction de l'orientation dans laquelle vous êtes sous iOS 8. Vous devrez explicitement le convertir en une limite de portrait en faisant quelque chose comme : [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace] mais assurez-vous de tester d'abord si vous êtes sous iOS 8, sinon cela va planter.

0 votes

Merci @Hafez de l'avoir signalé, je vais le tester pour iOS 8 et mettre à jour la réponse prochainement.

5voto

Adam Points 17726

Suite à la réponse de @Pichirich, j'ai référencé mon launchimage dans InterfaceBuilder comme :

"LaunchImage.png"

...et avec Xcode 5.0.2, il récupère automatiquement l'image appropriée directement dans le catalogue des ressources.

C'est ce à quoi je m'attendais - sauf pour le geste vicieux d'Apple qui renomme silencieusement "Default.png" en "LaunchImage.png" :)

0 votes

Une dernière chose à noter. La taille de ces images doit être exactement celle recommandée par Apple (320x480 pour LaunchImage pour iOS 5-6 iPhone 3GS par exemple), sinon ce serait nil après une initialisation donnée

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