Xcode 5 & Asset Catalog: comment référencer le LaunchImage?


102

J'utilise le catalogue d'actifs de Xcode 5 et j'aimerais utiliser mon LaunchImagecomme image d'arrière-plan de ma vue d'accueil (une pratique assez courante pour que la transition du «chargement» au «chargé» paraisse fluide).

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

Cependant, appeler:

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

Réponses:


83

Voici la liste (presque) complète du LaunchImage (à l'exclusion 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 (Portrait iPhone 6 Plus)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus Paysage)
  • LaunchImage-1100-Portrait-2436h@3x.png (Portrait iPhone X)
  • LaunchImage-1100-Landscape-2436h@3x.png (Paysage iPhone X)

Quelqu'un connaît les images iPad sans barre d'état?
Mohamed Hafez

1
@Mohamed Hafez: Pichirichi les a en fait inclus dans sa liste. Il s'agit de LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png et LaunchImage-Landscape@2x~ipad.png.
John Jacecko le

Que signifient les nombres 700 et 800?
Sound Blaster

2
Je l'ai attrapé: cela signifie iOS 7 & 8
Sound Blaster

4
C'est incroyablement ennuyeux que XCode crée automatiquement un nom de fichier pour ces images et vous fasse sauter à travers des cerceaux pour savoir comment y accéder directement ...
M. T

67
- (NSString *)splashImageNameForOrientation:(UIInterfaceOrientation)orientation {
    CGSize viewSize = self.view.bounds.size;
    NSString* viewOrientation = @"Portrait";
    if (UIDeviceOrientationIsLandscape(orientation)) {
        viewSize = CGSizeMake(viewSize.height, viewSize.width);
        viewOrientation = @"Landscape";
    }

    NSArray* imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
    for (NSDictionary* dict in imagesDict) {
        CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
        if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
            return dict[@"UILaunchImageName"];
    }
    return nil;
}

1
Fonctionne très bien. Approche intelligente et élégante pour rechercher dans le dictionnaire d'informations du bundle principal les images de lancement disponibles, puis choisir celle avec la résolution correspondante!
iOSX

1
C'est une idée géniale, meilleure que la mienne et également à l'épreuve du temps, à moins qu'Apple ne change la structure de info.plist.
nonamelive

1
C'est une solution très intelligente. J'ai plusieurs cibles dans mes projets Xcode et le simple fait d'utiliser la chaîne LaunchImage ne renvoie pas toujours l'image correcte. Merci beaucoup.
Enrico Susatyo

3
Excellente idée cependant. Mais ne fonctionne pas pour les écrans avec une barre d'état opaque. Il fallait donc changer self.view.bounds.size en [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri

1
Excellente solution. Petite modification requise: il existe une conversion implicite de UIInterfaceOrientation en UIDeviceOrientation. Utilisez UIInterfaceOrientationIsLandscape()plutôt.
Almog C

53

Les LaunchImages sont spéciales et ne sont pas en fait 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, puis écrire du code pour les utiliser - par exemple. pour un projet iPhone uniquement iOS7, cela définira 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]];

Je mets cela dans viewDidLoad.

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


2
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.
Zorayr

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

1
@Adam aimerait si c'était vrai! Je viens d'essayer sur iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] me donne nul.
JosephH

@JosephH hmm. Peut-être que cela nécessite un projet nouvellement créé? Il s'agit d'un projet créé dans Xcode 5.0.2, seule la modification des valeurs par défaut était "ARC désactivé". Cela fonctionne très bien :). Je vais voir si je peux trouver autre chose, mais je ne peux pas penser à ce que j'aurais pu changer d'autre
Adam

J'essayais un code similaire mais en utilisant "Default" et "Default-568h" (les noms de fichiers de ressources d'origine). Après avoir regardé à l'intérieur du bundle d'applications exportées, j'ai réalisé que Xcode change les noms en "LaunchImage-700 *".
Nicolas Miari

27

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

Voici comment je référence l'image de lancement 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 plus de paires valeur / clé si vous souhaitez prendre en charge les anciennes versions d'iOS.


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

1
Merci pour cela, exactement ce que je cherchais!
Joseph Paterson

Merci pour htis, une méthode pour accéder aux icônes d'application?
AsifHabib

10

Voici une catégorie sur UIImage basée sur la solution fournie par Cherpak Evgeny ci-dessus.

UIImage + SplashImage.h :

#import <UIKit/UIKit.h>

/**
 * Category on `UIImage` to access the splash image.
 **/
@interface UIImage (SplashImage)

/**
 * Return the name of the splash image for a given orientation.
 * @param orientation The interface orientation.
 * @return The name of the splash image.
 **/
+ (NSString *)si_splashImageNameForOrientation:(UIInterfaceOrientation)orientation;

/**
 * Returns the splash image for a given orientation.
 * @param orientation The interface orientation.
 * @return The splash image.
 **/
+ (UIImage*)si_splashImageForOrientation:(UIInterfaceOrientation)orientation;

@end

UIImage + SplashImage.m :

#import "UIImage+SplashImage.h"

@implementation UIImage (SplashImage)

+ (NSString *)si_splashImageNameForOrientation:(UIInterfaceOrientation)orientation
{
    CGSize viewSize = [UIScreen mainScreen].bounds.size;

    NSString *viewOrientation = @"Portrait";

    if (UIDeviceOrientationIsLandscape(orientation))
    {
        viewSize = CGSizeMake(viewSize.height, viewSize.width);
        viewOrientation = @"Landscape";
    }

    NSArray* imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];

    for (NSDictionary *dict in imagesDict)
    {
        CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
        if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
            return dict[@"UILaunchImageName"];
    }
    return nil;
}

+ (UIImage*)si_splashImageForOrientation:(UIInterfaceOrientation)orientation
{
    NSString *imageName = [self si_splashImageNameForOrientation:orientation];
    UIImage *image = [UIImage imageNamed:imageName];
    return image;
}

@end

imageNamed pousse l'image vers le cache système, mais l'image de lancement est parfois très énorme, elle est donc en mémoire jusqu'à ce que le cache la vide
Igor Palaguta

9

Réponse de @ codeman mise à jour pour Swift 1.2:

func splashImageForOrientation(orientation: UIInterfaceOrientation, size: CGSize) -> String? {
    var viewSize        = size
    var viewOrientation = "Portrait"

    if UIInterfaceOrientationIsLandscape(orientation) {
        viewSize        = CGSizeMake(size.height, size.width)
        viewOrientation = "Landscape"
    }

    if let imagesDict = NSBundle.mainBundle().infoDictionary as? [String: AnyObject] {
        if let imagesArray = imagesDict["UILaunchImages"] as? [[String: String]] {
            for dict in imagesArray {
                if let sizeString = dict["UILaunchImageSize"], let imageOrientation = dict["UILaunchImageOrientation"] {
                    let imageSize = CGSizeFromString(sizeString)
                    if CGSizeEqualToSize(imageSize, viewSize) && viewOrientation == imageOrientation {
                        if let imageName = dict["UILaunchImageName"] {
                            return imageName
                        }
                    }
                }
            }
        }
    }

    return nil

}

Pour l'appeler et prendre en charge la rotation pour iOS 8:

override func viewWillAppear(animated: Bool) {
    if let img = splashImageForOrientation(UIApplication.sharedApplication().statusBarOrientation, size: self.view.bounds.size) {
        backgroundImage.image = UIImage(named: img)
    }
}

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    let orientation = size.height > size.width ? UIInterfaceOrientation.Portrait : UIInterfaceOrientation.LandscapeLeft

    if let img = splashImageForOrientation(orientation, size: size) {
        backgroundImage.image = UIImage(named: img)
    }

}

Juste ce dont j'avais besoin, merci!


7

Je viens d'écrire une méthode générale pour obtenir le nom de l'image de démarrage pour iPhone et iPad (paysage, portrait), cela a fonctionné pour moi, j'espère que cela vous aide également. J'ai écrit ceci avec l'aide d'autres réponses 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;
}

Il y a en fait un léger bogue dans ce code pour isDeviceiPhone4: [[UIScreen mainScreen] bounds] change maintenant en fonction de l'orientation dans laquelle vous vous trouvez sous iOS 8. Vous devrez le convertir explicitement en limites de portrait en faisant quelque chose comme:, [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]mais faites assurez-vous de tester si vous êtes sur iOS 8 en premier, sinon cela plantera.
Mohamed Hafez

Merci @Hafez d'avoir souligné cela, je vais le tester pour iOS 8 et mettre à jour la réponse bientôt.
zaheer

7

Version rapide de la réponse de Cherpak Evgeny:

    func splashImageForOrientation(orientation: UIInterfaceOrientation) -> String {
        var viewSize = self.view.bounds.size
        var viewOrientation = "Portrait"
        if UIInterfaceOrientationIsLandscape(orientation) {
           viewSize = CGSizeMake(viewSize.height, viewSize.width)
           viewOrientation = "Landscape"
        }
        let imagesDict = NSBundle.mainBundle().infoDictionary as Dictionary<NSObject,AnyObject>!
        let imagesArray = imagesDict["UILaunchImages"] as NSArray
        for dict in imagesArray {
            let dictNSDict = dict as NSDictionary
            let imageSize = CGSizeFromString(dictNSDict["UILaunchImageSize"] as String)
            if CGSizeEqualToSize(imageSize, viewSize) && viewOrientation == (dictNSDict["UILaunchImageOrientation"] as String) {
                return dictNSDict["UILaunchImageName"] as String
            }
        }
        return ""
    }

5

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

"LaunchImage.png"

... et avec Xcode 5.0.2, il extrait automatiquement l'image appropriée directement du catalogue d'actifs.

C'est ce à quoi je m'attendais - à l'exception du geste vicieusement méchant d'Apple consistant à renommer silencieusement "Default.png" en "LaunchImage.png" :)


Une dernière chose doit être notée. Les tailles de ces images doivent être exactement comme Apple recommande (320x480 pour LaunchImage pour iOS 5-6 iPhone 3GS par exemple), sinon ce serait nilaprès l'initialisation donnée
Alexander Kostiev

3

Dans la documentation, il est clairement indiqué:

"Chaque ensemble dans un catalogue d'actifs a un nom . Vous pouvez utiliser ce nom pour charger par programme toute image individuelle contenue dans l'ensemble. Pour charger une image, appelez la méthode UIImage: ImageNamed: en transmettant le nom de l'ensemble contenant l'image . "

L'utilisation de la liste de Pichirichi permet de résoudre cette incohérence.


1
Notez la partie "nom de l'ensemble". En regardant mon catalogue d'actifs, j'ai un ensemble appelé "LaunchImage". Pour charger l'image de lancement, j'ai appelé: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Fonctionne très bien!
leanne

1
Pas besoin d'utiliser la liste de Pichirichi (je pense que c'est toujours une information géniale à connaître) - utilisez simplement le nom de "l'ensemble" du catalogue d'actifs.
leanne

2
Eh bien, pour moi, cela ne fonctionne pas pour l'image de lancement sur Xcode 6.0.1 et iOS 8. La LaunchImage semble être spéciale car les images se retrouvent individuellement dans le bundle d'applications compilées et ne restent pas dans le dossier du bundle xcasset.
auco

Que se passe-t-il s'il existe deux catalogues d'actifs différents contenant des ensembles de noms identiques? Comment [UIImage imageNamed:..]savoir lequel choisir?
Carlos P

Pour moi, cela ne fonctionne pas, XCode 6.0.1 iOS 7 iPod Touch
dev

3

On peut facilement accéder à l'image de lancement par une ligne de code.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Veuillez suivre les étapes ci-dessous pour obtenir les fonctionnalités décrites ci-dessus.

Étape 1. Étendez laUIImageclasse en créant une catégorie et ajoutez-y la méthode suivante.

+ (UIImage *)launchImage {
    NSDictionary *dOfLaunchImage = [NSDictionary dictionaryWithObjectsAndKeys:
                                    @"LaunchImage-568h@2x.png",@"568,320,2,8,p", // ios 8 - iphone 5 - portrait
                                    @"LaunchImage-568h@2x.png",@"568,320,2,8,l", // ios 8 - iphone 5 - landscape
                                    @"LaunchImage-700-568h@2x.png",@"568,320,2,7,p", // ios 7 - iphone 5 - portrait
                                    @"LaunchImage-700-568h@2x.png",@"568,320,2,7,l", // ios 7 - iphone 5 - landscape
                                    @"LaunchImage-700-Landscape@2x~ipad.png",@"1024,768,2,7,l", // ios 7 - ipad retina - landscape
                                    @"LaunchImage-700-Landscape~ipad.png",@"1024,768,1,7,l", // ios 7 - ipad regular - landscape
                                    @"LaunchImage-700-Portrait@2x~ipad.png",@"1024,768,2,7,p", // ios 7 - ipad retina - portrait
                                    @"LaunchImage-700-Portrait~ipad.png",@"1024,768,1,7,p", // ios 7 - ipad regular - portrait
                                    @"LaunchImage-700@2x.png",@"480,320,2,7,p", // ios 7 - iphone 4/4s retina - portrait
                                    @"LaunchImage-700@2x.png",@"480,320,2,7,l", // ios 7 - iphone 4/4s retina - landscape
                                    @"LaunchImage-Landscape@2x~ipad.png",@"1024,768,2,8,l", // ios 8 - ipad retina - landscape
                                    @"LaunchImage-Landscape~ipad.png",@"1024,768,1,8,l", // ios 8 - ipad regular - landscape
                                    @"LaunchImage-Portrait@2x~ipad.png",@"1024,768,2,8,p", // ios 8 - ipad retina - portrait
                                    @"LaunchImage-Portrait~ipad.png",@"1024,768,1,8,l", // ios 8 - ipad regular - portrait
                                    @"LaunchImage.png",@"480,320,1,7,p", // ios 6 - iphone 3g/3gs - portrait
                                    @"LaunchImage.png",@"480,320,1,7,l", // ios 6 - iphone 3g/3gs - landscape
                                    @"LaunchImage@2x.png",@"480,320,2,8,p", // ios 6,7,8 - iphone 4/4s - portrait
                                    @"LaunchImage@2x.png",@"480,320,2,8,l", // ios 6,7,8 - iphone 4/4s - landscape
                                    @"LaunchImage-800-667h@2x.png",@"667,375,2,8,p", // ios 8 - iphone 6 - portrait
                                    @"LaunchImage-800-667h@2x.png",@"667,375,2,8,l", // ios 8 - iphone 6 - landscape
                                    @"LaunchImage-800-Portrait-736h@3x.png",@"736,414,3,8,p", // ios 8 - iphone 6 plus - portrait
                                    @"LaunchImage-800-Landscape-736h@3x.png",@"736,414,3,8,l", // ios 8 - iphone 6 plus - landscape
                                    nil];
    NSInteger width = ([UIScreen mainScreen].bounds.size.width>[UIScreen mainScreen].bounds.size.height)?[UIScreen mainScreen].bounds.size.width:[UIScreen mainScreen].bounds.size.height;
    NSInteger height = ([UIScreen mainScreen].bounds.size.width>[UIScreen mainScreen].bounds.size.height)?[UIScreen mainScreen].bounds.size.height:[UIScreen mainScreen].bounds.size.width;
    NSInteger os = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] integerValue];
    NSString *strOrientation = UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])?@"l":@"p";
    NSString *strImageName = [NSString stringWithFormat:@"%li,%li,%li,%li,%@",width,height,(NSInteger)[UIScreen mainScreen].scale,os,strOrientation];
    UIImage *imageToReturn = [UIImage imageNamed:[dOfLaunchImage valueForKey:strImageName]];
    if([strOrientation isEqualToString:@"l"] && [strImageName rangeOfString:@"Landscape"].length==0) {
        imageToReturn = [UIImage rotate:imageToReturn orientation:UIImageOrientationRight];
    }
    return imageToReturn;
}

Étape 2. La méthode ci-dessus devrait fonctionner en ajoutant le code suivant également dans la même catégorie deUIImage

static inline double radians (double degrees) {return degrees * M_PI/180;}

+ (UIImage *)rotate:(UIImage*)src orientation:(UIImageOrientation) orientation {
    UIGraphicsBeginImageContext(src.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    if (orientation == UIImageOrientationRight) {
        CGContextRotateCTM (context, radians(90));
    } else if (orientation == UIImageOrientationLeft) {
        CGContextRotateCTM (context, radians(-90));
    } else if (orientation == UIImageOrientationDown) {
        // NOTHING
    } else if (orientation == UIImageOrientationUp) {
        CGContextRotateCTM (context, radians(90));
    }
    [src drawAtPoint:CGPointMake(0, 0)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

Excellente réponse, merci!
dortzur

1
Quel est le nom de l'image de lancement de l'iPhone X maintenant?
RPM

2

Je me rends compte que ce n'est pas nécessairement la meilleure solution pour tout le monde, mais le moyen le plus simple (et le moins sujet aux erreurs, à mon humble avis) est de faire une entrée séparée dans votre catalogue Images.xcassets. Je l'ai appelé SplashImage.

Lorsque vous allez ajouter une nouvelle entrée, assurez-vous de ne pas sélectionner "Nouvelle image de lancement" comme option. Au lieu de cela, sélectionnez le "Nouvel ensemble d'images" générique. Ensuite, ouvrez l'inspecteur et sélectionnez les options appropriées. Si vous construisez uniquement pour des appareils Retina, comme je l'étais, vous pouvez sélectionner les éléments suivants:

inspecteur d'image

Cela vous laissera avec quatre entrées (iPhone 4S, iPhone 5 (s, c), iPhone 6 et iPhone 6 Plus).

images

Les fichiers correspondant aux images sont les suivants:

| Resolution (Xcode entry) | Launch Image name   |   Device         |
|--------------------------|---------------------|------------------|
| 1x                       | Default-750.png     | iPhone 6         |
| 2x                       | Default@2x.png      | iPhone 4S        |
| Retina 4 2x              | Default-568h@2x.png | iPhone 5, 5s, 5c |
| 3x                       | Default-1242.png    | iPhone 6 Plus    |

Bien sûr, après avoir fait cela, vous pouvez simplement utiliser [UIImage imageNamed:@"SplashImage"]


1
Idée intéressante, mais cela ne fonctionne pas sur iPhone 6. Il charge toujours l'image Default@2x.png sur le simulateur iPhone 6.
nonamelive

En utilisant cette approche, vous devez également prendre en compte l'ensemble des images de lancement pour l'orientation paysage.
berec

2

Avec l'aide de la réponse de Pichirichi, j'ai implémenté la catégorie suivante (iOS 7+): UIImage + AssetLaunchImage

C'est en fait un peu plus que générer un nom à la volée, mais cela sera probablement utile.


0

Mise à jour de la dernière syntaxe Swift (Swift 5)

   func splashImageForOrientation(orientation: UIInterfaceOrientation) -> String? {

    var viewSize = screenSize
    var viewOrientation = "Portrait"
    if orientation.isLandscape {
        viewSize = CGSize(width: viewSize.height, height: viewSize.width)
        viewOrientation = "Landscape"
    }
    if let infoDict = Bundle.main.infoDictionary, let launchImagesArray = infoDict["UILaunchImages"] as? [Any] {
        for launchImage in launchImagesArray {
            if let launchImage = launchImage as? [String: Any], let nameString = launchImage["UILaunchImageName"] as? String, let sizeString = launchImage["UILaunchImageSize"] as? String, let orientationString = launchImage["UILaunchImageOrientation"] as? String {
                let imageSize = NSCoder.cgSize(for: sizeString)
                if imageSize.equalTo(viewSize) && viewOrientation == orientationString {
                    return nameString
                }
            }
        }
    }
    return nil
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.