Xcode 5 e catalogo delle risorse: come fare riferimento a LaunchImage?


102

Sto usando il catalogo delle risorse di Xcode 5 e vorrei usare il mio LaunchImagecome immagine di sfondo della mia visualizzazione iniziale (una pratica abbastanza comune per rendere il passaggio da "caricamento" a "caricato" un aspetto fluido).

Vorrei utilizzare la stessa voce nel Catalogo risorse per risparmiare spazio e non dover replicare l'immagine in due diversi set di immagini.

Tuttavia, chiamando:

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

Risposte:


83

Questo è l'elenco (quasi) completo di LaunchImage (escluse le immagini dell'iPad senza barra di stato):

  • LaunchImage-568h@2x.png
  • LaunchImage-700-568h@2x.png
  • LaunchImage-700-Landscape@2x~ipad.png
  • LaunchImage-700-Paesaggio ~ ipad.png
  • LaunchImage-700-Portrait@2x~ipad.png
  • LaunchImage-700-Portrait ~ ipad.png
  • LaunchImage-700@2x.png
  • LaunchImage-Landscape@2x~ipad.png
  • LaunchImage-Paesaggio ~ 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 verticale)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus orizzontale)
  • LaunchImage-1100-Portrait-2436h@3x.png (iPhone X verticale)
  • LaunchImage-1100-Landscape-2436h@3x.png (iPhone X orizzontale)

Qualcuno conosce le immagini dell'iPad senza barra di stato?
Mohamed Hafez,

1
@ Mohamed Hafez: Pichirichi li ha effettivamente inclusi nella sua lista. Sono LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png e LaunchImage-Landscape@2x~ipad.png.
John Jacecko,

Cosa significano i numeri 700 e 800?
Sound Blaster

2
Ho capito: significa iOS 7 e 8
Sound Blaster

4
È incredibilmente fastidioso che XCode crei automaticamente un nome file per queste risorse immagine e ti faccia saltare attraverso i cerchi per capire come accedervi direttamente ...
Mr. 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
Funziona alla grande. Approccio intelligente ed elegante per cercare nel dizionario delle informazioni del pacchetto principale le immagini di avvio disponibili e quindi scegliere quella con risoluzione corrispondente!
iOSX

1
Questa è un'idea geniale, migliore della mia e anche a prova di futuro, a meno che Apple non cambi la struttura di info.plist.
nonamelive

1
Questa è una soluzione molto intelligente. Ho più target nei miei progetti Xcode e il solo utilizzo della stringa LaunchImage non restituisce sempre l'immagine corretta. Molte grazie.
Enrico Susatyo

3
Idea geniale però. Ma non funziona per schermi con barra di stato opaca. Quindi era necessario cambiare self.view.bounds.size in [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri

1
Ottima soluzione. Piccola modifica richiesta: c'è una conversione implicita da UIInterfaceOrientation a UIDeviceOrientation. Usa UIInterfaceOrientationIsLandscape()invece.
Almog C

53

Le LaunchImages sono speciali e non sono in realtà un catalogo di risorse sul dispositivo. Se guardi usando iFunBox / iExplorer / etc (o sul simulatore, o nella directory di build) puoi vedere i nomi finali, e poi scrivere il codice per usarli - es. per un progetto solo per iPhone solo iOS7, questo imposterà l'immagine di avvio giusta:

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

Lo metto in viewDidLoad.

Non è proprio l'ideale, sarebbe fantastico se Apple ci fornisse una bella API per farlo.


2
Questo ha funzionato per me, ma vorrei davvero che ci fosse un modo più semplice per fare riferimento all'immagine di lancio.
Zorayr

Forse risolto in Xcode 5.0.2 - vedi sotto, sembra funzionare per me semplicemente per fare riferimento a "LaunchImage.png"
Adam

1
@Adam Mi piacerebbe se fosse vero! Ho appena provato su iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] mi dà zero.
JosephH

@JosephH hmm. Forse richiede un progetto appena creato? Questo è un progetto creato in Xcode 5.0.2, l'unica modifica ai valori predefiniti era "ARC disabilitato". Funziona benissimo :). Vedrò se riesco a trovare qualcos'altro, ma non riesco a pensare a cos'altro avrei potuto cambiare
Adam

Stavo provando un codice simile ma utilizzando "Default" e "Default-568h" (i nomi dei file di risorse originali). Dopo aver guardato all'interno del bundle dell'app esportato, mi sono reso conto che Xcode cambia i nomi in "LaunchImage-700 *".
Nicolas Miari

27

La mia app attualmente supporta solo iOS 7 e versioni successive.

Ecco come faccio riferimento all'immagine di avvio dal catalogo delle risorse:

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

Puoi aggiungere più coppie di valori chiave se desideri supportare versioni iOS precedenti.


1
Nota che a partire da iOS 8, UIScreen.mainScreen.boundsè diverso a seconda dell'attuale orientamento dell'interfaccia. Vedi stackoverflow.com/a/24153540/158525
Jean Regisser

1
Grazie per questo, esattamente quello che stavo cercando!
Joseph Paterson

Grazie per htis, qualche metodo per accedere alle icone delle app?
AsifHabib

10

Ecco una categoria su UIImage basata sulla soluzione fornita da Cherpak Evgeny sopra.

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 spinge l'immagine nella cache di sistema, ma l'immagine di avvio a volte è molto grande, quindi è in memoria finché la cache non la
scarica

9

Risposta di @ codeman aggiornata per 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

}

Per chiamarlo e per supportare la rotazione per 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)
    }

}

Proprio quello di cui avevo bisogno, grazie!


7

Ho appena scritto un metodo generale per ottenere il nome dell'immagine splash per iPhone e iPad (orizzontale, verticale), ha funzionato per me, spero che ti aiuti anche. L'ho scritto con l'aiuto di altre risposte SO, grazie @Pichirichi per l'intera lista.

+(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];
    }
 }
}

Altri metodi di utilità sono

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

In realtà c'è un leggero bug in questo codice per isDeviceiPhone4: [[UIScreen mainScreen] bounds] ora cambia in base all'orientamento in cui ti trovi sotto iOS 8. Dovrai convertirlo esplicitamente in un limite verticale facendo qualcosa come:, [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]ma fai assicurati di testare prima se sei su iOS 8, altrimenti si bloccherà.
Mohamed Hafez

Grazie @Hafez per averlo sottolineato, lo testerò per iOS 8 e aggiornerò presto la risposta.
zaheer

7

Versione rapida della risposta di 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

Seguendo la risposta di @ Pichirich, ho fatto riferimento alla mia immagine di avvio in InterfaceBuilder come:

"LaunchImage.png"

... e con Xcode 5.0.2, estrae automaticamente l'immagine appropriata direttamente dal Catalogo risorse.

Questo è quello che mi sarei aspettato, tranne che per la mossa malvagia di Apple di rinominare silenziosamente "Default.png" in "LaunchImage.png" :)


Un'altra cosa da notare. Le dimensioni di queste immagini dovrebbero essere esattamente quelle consigliate da Apple (320x480 per LaunchImage per iOS 5-6 iPhone 3GS per esempio), altrimenti sarebbe nildopo l'inizializzazione data
Alexander Kostiev

3

Nella documentazione è chiaramente indicato:

"Ogni set in un catalogo di risorse ha un nome . Puoi utilizzare quel nome per caricare in modo programmatico qualsiasi singola immagine contenuta nel set. Per caricare un'immagine, chiama UIImage: ImageNamed: passando il nome del set che contiene l'immagine ".

Utilizzare l'elenco di Pichirichi aiuta a risolvere questa incoerenza.


1
Notare la parte "nome del set". Guardando il mio catalogo di risorse, ho un set chiamato "LaunchImage". Per caricare l'immagine di lancio, quindi, ho chiamato: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Funziona alla grande!
leanne

1
Non c'è bisogno di usare l'elenco di Pichirichi (penso che sia ancora un'informazione fantastica da sapere) - usa semplicemente il nome del "set" del catalogo delle risorse.
leanne

2
Bene, per me questo non funziona per l'immagine di avvio su Xcode 6.0.1 e iOS 8. LaunchImage sembra essere speciale in quanto le immagini finiscono individualmente nel pacchetto dell'app compilato e non rimangono all'interno della cartella del pacchetto xcasset.
auco

Cosa succede se sono presenti due diversi cataloghi di risorse contenenti set con lo stesso nome? Come [UIImage imageNamed:..]saprei quale scegliere?
Carlos P

Per me questo non funziona, XCode 6.0.1 iOS 7 iPod Touch
dev

3

È possibile accedere facilmente all'immagine di avvio con una riga di codice.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Seguire i passaggi indicati di seguito per ottenere la funzionalità illustrata sopra.

Passaggio 1. Estendi laUIImageclasse creando una categoria e aggiungendovi il seguente metodo.

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

Passaggio 2. Il metodo sopra dovrebbe funzionare aggiungendo il codice seguente anche nella stessa categoria diUIImage

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

Ottima risposta, grazie!
Dortzur

1
Qual è il nome per l'immagine di lancio di iPhone X ora?
RPM

2

Mi rendo conto che questa non è necessariamente la soluzione migliore per tutti, ma il modo più semplice (e meno soggetto a errori, IMHO) per farlo è creare una voce separata nel tuo catalogo Images.xcassets. L'ho chiamato SplashImage.

Quando vai ad aggiungere una nuova voce, assicurati di non selezionare "Nuova immagine di avvio" come opzione. Selezionare invece il generico "Nuovo set di immagini". Quindi, apri l'ispettore e seleziona le opzioni pertinenti. Se stai costruendo solo per dispositivi retina, come prima, puoi selezionare quanto segue:

ispettore immagine

Questo ti lascerà con quattro voci (iPhone 4S, iPhone 5 (s, c), iPhone 6 e iPhone 6 Plus).

immagini

I file corrispondenti alle immagini sono i seguenti:

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

Naturalmente, dopo averlo fatto puoi semplicemente usare [UIImage imageNamed:@"SplashImage"]


1
Idea interessante, ma non funziona su iPhone 6. Carica comunque l'immagine Default@2x.png sul simulatore di iPhone 6.
2014

Usando questo approccio dovresti occuparti del set di immagini di avvio anche per l'orientamento orizzontale.
berec


0

Aggiornato all'ultima sintassi di 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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.