Xcode 5 & Asset Catalog: Como fazer referência ao LaunchImage?


102

Estou usando o Catálogo de Ativos do Xcode 5 e gostaria de usá-lo LaunchImagecomo imagem de fundo de minha visualização inicial (uma prática bastante comum para fazer a transição de 'carregando' para 'carregado' parecer suave).

Gostaria de usar a mesma entrada no Catálogo de ativos para economizar espaço e não ter que replicar a imagem em dois conjuntos de imagens diferentes.

No entanto, ligando para:

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

Respostas:


83

Esta é a lista (quase) completa do LaunchImage (excluindo as imagens do iPad sem barra de status):

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

Alguém conhece as imagens do iPad sem barra de status?
Mohamed Hafez

1
@Mohamed Hafez: Pichirichi realmente os inclui em sua lista. Eles são LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png e LaunchImage-Landscape@2x~ipad.png.
John Jacecko

O que significam os números 700 e 800?
Sound Blaster

2
Eu percebi: significa iOS 7 e 8
Sound Blaster

4
É incrivelmente irritante que o XCode criará automaticamente um nome de arquivo para esses ativos de imagem e fará com que você se esforce para descobrir como acessá-los diretamente ...
Sr. 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
Funciona bem. Abordagem inteligente e elegante para pesquisar o dicionário de informações do pacote principal para imagens de lançamento disponíveis e, em seguida, escolher aquela com a resolução correspondente!
iOSX

1
Esta é uma ideia brilhante, melhor do que a minha e também preparada para o futuro, a menos que a Apple mude a estrutura do info.plist.
nonamelive de

1
Esta é uma solução muito inteligente. Eu tenho vários destinos em meus projetos Xcode e apenas usar a string LaunchImage nem sempre retorna a imagem correta. Muito obrigado.
Enrico Susatyo

3
Embora uma ideia brilhante. Mas não funciona para telas com barra de status opaca. Então, precisava mudar self.view.bounds.size para [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri

1
Ótima solução. Pequena edição necessária: há uma conversão implícita de UIInterfaceOrientation para UIDeviceOrientation. Use em seu UIInterfaceOrientationIsLandscape()lugar.
Almog C

53

Os LaunchImages são especiais e não são realmente um catálogo de ativos no dispositivo. Se você olhar usando iFunBox / iExplorer / etc (ou no simulador, ou no diretório de compilação), você pode ver os nomes finais e escrever o código para usá-los - por exemplo. para um projeto apenas para iPhone apenas iOS7, isso definirá a imagem de inicialização certa:

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

Coloquei isso em viewDidLoad.

Isso não é realmente ideal, seria ótimo se a Apple nos desse uma boa API para fazer isso.


2
Isso funcionou para mim, mas eu realmente gostaria que houvesse uma maneira mais simples de referenciar a imagem de lançamento.
Zorayr

Talvez corrigido no Xcode 5.0.2 - veja abaixo, parece funcionar para mim simplesmente para fazer referência a "LaunchImage.png"
Adam

1
@Adam Adoraria se isso fosse verdade! Acabei de experimentar iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] me dá nulo.
JosephH

@JosephH hmm. Talvez exija um projeto recém-criado? Este é um projeto criado no Xcode 5.0.2, apenas a mudança para os padrões foi "disabled ARC". Está funcionando muito bem :). Vou ver se consigo encontrar mais alguma coisa, mas não consigo pensar no que mais eu poderia ter mudado
Adam

Eu estava tentando um código semelhante, mas usando "Padrão" e "Padrão-568h" (os nomes dos arquivos de recursos originais). Depois de olhar dentro do pacote de aplicativos exportado, percebi que o Xcode altera os nomes para "LaunchImage-700 *".
Nicolas Miari

27

Meu aplicativo atualmente suporta apenas iOS 7 e posterior.

É assim que faço referência à imagem de lançamento do catálogo de ativos:

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

Você pode adicionar mais pares de valores-chave se quiser oferecer suporte a versões mais antigas do iOS.


1
Observe que a partir do iOS 8, UIScreen.mainScreen.boundsé diferente dependendo da orientação atual da interface. Consulte stackoverflow.com/a/24153540/158525
Jean Regisser

1
Obrigado por isso, exatamente o que eu estava procurando!
Joseph Paterson

Obrigado por htis, algum método para acessar ícones de aplicativos?
AsifHabib 01 de

10

Aqui está uma categoria no UIImage baseada na solução fornecida por Cherpak Evgeny acima.

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 envia a imagem para o cache do sistema, mas a imagem de inicialização às vezes é muito grande, por isso fica na memória até que o cache a
libere

9

Resposta de @ codeman atualizada para 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

}

Para chamá-lo e apoiar a rotação para 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)
    }

}

Exatamente o que eu precisava, obrigado!


7

Acabei de escrever um método geral para obter o nome da imagem inicial para iPhone e iPad (paisagem, retrato), funcionou para mim, espero que ajude você também. Escrevi isso com a ajuda de outras respostas do SO, obrigado @Pichirichi pela lista completa.

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

Outros métodos utilitários são

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

Na verdade, há um pequeno bug neste código para isDeviceiPhone4: [[UIScreen mainScreen] limites] agora muda com base na orientação em que você está no iOS 8. Você precisará convertê-lo explicitamente em limites de retrato fazendo algo como:, [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]mas faça certifique-se de testar se você está no iOS 8 primeiro, caso contrário, ele travará.
Mohamed Hafez

Obrigado @Hafez por apontar isso, vou testá-lo para iOS 8 e atualizar a resposta em breve.
zaheer

7

Versão rápida da resposta 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

Seguindo a resposta de @Pichirich, referenciei minha imagem de lançamento no InterfaceBuilder como:

"LaunchImage.png"

... e com o Xcode 5.0.2, ele está retirando automaticamente a imagem apropriada diretamente do Catálogo de ativos.

Isso é o que eu esperava - exceto pelo movimento cruelmente desagradável da Apple de silenciosamente renomear "Default.png" para "LaunchImage.png" :)


Mais uma coisa deve ser observada. Os tamanhos dessas imagens devem ser exatamente como a Apple recomenda (320x480 para LaunchImage para iOS 5-6 iPhone 3GS, por exemplo), caso contrário, seriam nilapós a inicialização
Alexander Kostiev

3

Na documentação está claramente indicado:

"Cada conjunto em um catálogo de ativos tem um nome . Você pode usar esse nome para carregar programaticamente qualquer imagem individual contida no conjunto. Para carregar uma imagem, chame o método UIImage: ImageNamed : , passando o nome do conjunto que contém a imagem . "

Usar a lista de Pichirichi ajuda a resolver essa inconsistência.


1
Observe a parte "nome do conjunto". Olhando para meu catálogo de ativos, tenho um conjunto chamado "LaunchImage". Para carregar a imagem de lançamento, então, chamei: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Funciona muito bem!
leanne

1
Não há necessidade de usar a lista de Pichirichi (pensei que ainda seja uma informação incrível de saber) - apenas use o nome do "conjunto" do catálogo de ativos.
leanne

2
Bem, para mim isso não funciona para o Launch Image no Xcode 6.0.1 e iOS 8. O LaunchImage parece ser especial, pois as imagens terminam individualmente no pacote de aplicativos compilado e não permanecem dentro da pasta do pacote xcasset.
auco

O que acontecerá se houver dois catálogos de ativos diferentes contendo conjuntos com nomes idênticos? Como [UIImage imageNamed:..]saberia qual escolher?
Carlos P

Para mim, isso não funciona, XCode 6.0.1 iOS 7 iPod Touch
dev

3

Pode-se acessar facilmente a imagem do Launch por uma linha de código.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Siga as etapas fornecidas abaixo para obter a funcionalidade descrita acima.

Etapa 1. Estenda aUIImageclasse criando uma categoria e adicione o método a seguir a ela.

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

Etapa 2. O método acima deve funcionar adicionando o código a seguir também na mesma categoria 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;
}

Excelente resposta, obrigado!
dortzur,

1
Qual é o nome da imagem de lançamento do iPhone X agora?
RPM de

2

Sei que essa não é necessariamente a melhor solução para todos, mas a maneira mais fácil (e menos propensa a erros, IMHO) de fazer isso é fazendo uma entrada separada em seu catálogo Images.xcassets. Eu chamei SplashImage.

Quando for adicionar uma nova entrada, certifique-se de não selecionar "Nova imagem de inicialização" como uma opção. Em vez disso, selecione o genérico "Novo conjunto de imagens". Em seguida, abra o inspetor e selecione as opções relevantes. Se você estiver construindo apenas para dispositivos de retina, como eu, você pode selecionar o seguinte:

inspetor de imagem

Isso deixará você com quatro entradas (iPhone 4S, iPhone 5 (s, c), iPhone 6 e iPhone 6 Plus).

imagens

Os arquivos correspondentes às imagens são os seguintes:

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

Claro, depois de fazer isso, você pode simplesmente usar [UIImage imageNamed:@"SplashImage"]


1
Ideia interessante, mas não funciona no iPhone 6. Ele ainda carrega a imagem Default@2x.png no simulador do iPhone 6.
nonamelive de

Usando essa abordagem, você também deve tomar cuidado com o conjunto de imagens de lançamento para a orientação paisagem.
berec


0

Atualizado para a sintaxe Swift mais recente (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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.