Xcode 5 & Asset Catalog: ¿Cómo hacer referencia a LaunchImage?


102

Estoy usando el Asset Catalog de Xcode 5, y me gustaría usar my LaunchImagecomo imagen de fondo de mi vista de inicio (una práctica bastante común para hacer que la transición de 'carga' a 'cargado' parezca fluida).

Me gustaría usar la misma entrada en el Catálogo de activos para ahorrar espacio y no tener que replicar la imagen en dos Conjuntos de imágenes diferentes.

Sin embargo, llamando:

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

Respuestas:


83

Esta es la lista (casi) completa de LaunchImage (excluyendo las imágenes del iPad sin barra de estado):

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

¿Alguien conoce las imágenes de iPad sin barra de estado?
Mohamed Hafez

1
@Mohamed Hafez: Pichirichi los tiene incluidos en su lista. Son LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png y LaunchImage-Landscape@2x~ipad.png.
John Jacecko

¿Qué significan los números 700 y 800?
Sound Blaster

2
Lo pillé: significa iOS 7 y 8
Sound Blaster

4
Es increíblemente molesto que XCode cree automáticamente un nombre de archivo para estos recursos de imagen y te haga pasar por aros para descubrir cómo acceder directamente a ellos ...
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
Funciona genial. ¡Enfoque inteligente y elegante para buscar imágenes de lanzamiento disponibles en el diccionario de información del paquete principal y luego elegir la que tenga la resolución correspondiente!
iOSX

1
Esta es una idea brillante, mejor que la mía y también preparada para el futuro, a menos que Apple cambie la estructura de info.plist.
finaliza

1
Ésta es una solución muy inteligente. Tengo varios objetivos en mis proyectos de Xcode y el solo uso de la cadena LaunchImage no siempre devuelve la imagen correcta. Muchas gracias.
Enrico Susatyo

3
Sin embargo, brillante idea. Pero no funciona para pantallas con barra de estado opaca. Por lo tanto, es necesario cambiar self.view.bounds.size a [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri

1
Gran solución. Se requiere una pequeña edición: hay una conversión implícita de UIInterfaceOrientation a UIDeviceOrientation. Úselo en su UIInterfaceOrientationIsLandscape()lugar.
Almog C

53

Las LaunchImages son especiales y en realidad no son un catálogo de activos en el dispositivo. Si busca usando iFunBox / iExplorer / etc (o en el simulador, o en el directorio de compilación), puede ver los nombres finales y luego escribir el código para usarlos, por ejemplo. para un proyecto solo para iPhone con iOS7, esto establecerá la imagen de inicio correcta:

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

Pongo esto en viewDidLoad.

Esto no es realmente ideal, sería genial si Apple nos diera una buena API para hacer esto.


2
Esto funcionó para mí, pero realmente desearía que hubiera una forma más sencilla de hacer referencia a la imagen de lanzamiento.
Zorayr

Tal vez arreglado en Xcode 5.0.2 - ver más abajo, parece funcionar para mí simplemente para hacer referencia a "LaunchImage.png"
Adam

1
@Adam ¡Me encantaría si eso fuera cierto! Acabo de probar en iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] me da cero.
JosephH

@JosephH hmm. ¿Quizás requiera un proyecto recién creado? Este es un proyecto creado en Xcode 5.0.2, el único cambio a los valores predeterminados fue "ARC deshabilitado". Está funcionando muy bien :). Veré si puedo encontrar algo más, pero no puedo pensar qué más podría haber cambiado
Adam

Estaba probando un código similar pero usando "Default" y "Default-568h" (los nombres de archivo de recursos originales). Después de mirar dentro del paquete de aplicaciones exportado, me di cuenta de que Xcode cambia los nombres a "LaunchImage-700 *".
Nicolas Miari

27

Actualmente, mi aplicación solo es compatible con iOS 7 y versiones posteriores.

Así es como hago referencia a la imagen de lanzamiento del catálogo de activos:

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

Puede agregar más pares clave-valor si desea admitir versiones anteriores de iOS.


1
Tenga en cuenta que, a partir de iOS 8, UIScreen.mainScreen.boundses diferente según la orientación de la interfaz actual. Ver stackoverflow.com/a/24153540/158525
Jean Regisser

1
Gracias por esto, ¡exactamente lo que estaba buscando!
Joseph Paterson

Gracias por htis, ¿algún método para acceder a los iconos de aplicaciones?
AsifHabib

10

Aquí una categoría en UIImage basada en la solución proporcionada por Cherpak Evgeny arriba.

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 empuja la imagen al caché del sistema, pero la imagen de lanzamiento a veces es muy grande, por lo que está en la memoria hasta que el caché la
vacía

9

La respuesta de @ codeman actualizada 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 llamarlo y admitir la rotación 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)
    }

}

¡Justo lo que necesitaba, gracias!


7

Acabo de escribir un método general para obtener el nombre de la imagen de bienvenida para iPhone y iPad (paisaje, retrato), funcionó para mí, espero que también te ayude. Escribí esto con la ayuda de otras respuestas SO, gracias @Pichirichi por toda la 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];
    }
 }
}

Otros métodos de utilidad son

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

De hecho, hay un pequeño error en este código para isDeviceiPhone4: [[UIScreen mainScreen] límites] ahora cambia según la orientación en la que se encuentre en iOS 8. Deberá convertirlo explícitamente en límites verticales haciendo algo como:, [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]pero haga asegúrese de probar primero si está en iOS 8, de lo contrario, se bloqueará.
Mohamed Hafez

Gracias @Hafez por señalar eso, lo probaré para iOS 8 y actualizaré la respuesta pronto.
zaheer

7

Versión rápida de la respuesta 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

Siguiendo la respuesta de @ Pichirich, hice referencia a mi imagen de lanzamiento en InterfaceBuilder como:

"LaunchImage.png"

... y con Xcode 5.0.2, está sacando automáticamente la imagen adecuada directamente del Catálogo de activos.

Esto es lo que esperaría, excepto por el movimiento brutalmente desagradable de Apple de cambiar silenciosamente el nombre de "Default.png" a "LaunchImage.png" :)


Cabe señalar una cosa más. Los tamaños de estas imágenes deben ser exactamente los que recomienda Apple (320x480 para LaunchImage para iOS 5-6 iPhone 3GS, por ejemplo), de lo contrario, sería nildespués de la inicialización
Alexander Kostiev

3

En la documentación se indica claramente:

"Cada conjunto en un catálogo de activos tiene un nombre . Puede usar ese nombre para cargar mediante programación cualquier imagen individual contenida en el conjunto. Para cargar una imagen, llame a UIImage: ImageNamed: método pasando el nombre del conjunto que contiene la imagen . "

Usar la lista de Pichirichi ayuda a resolver esta inconsistencia.


1
Tenga en cuenta la parte "nombre del conjunto". Mirando mi catálogo de activos, tengo un conjunto llamado "LaunchImage". Para cargar la imagen de inicio, llamé: ¡ UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Funciona muy bien!
leanne

1
No es necesario usar la lista de Pichirichi (creo que es una información increíble), solo use el nombre del "conjunto" del catálogo de activos.
leanne

2
Bueno, para mí esto no funciona para Launch Image en Xcode 6.0.1 y iOS 8. LaunchImage parece ser especial ya que las imágenes terminan individualmente en el paquete de aplicaciones compilado y no permanecen dentro de la carpeta del paquete xcasset.
auco

¿Qué sucede si hay dos catálogos de activos diferentes que contienen conjuntos con nombres idénticos? ¿Cómo [UIImage imageNamed:..]sabría cuál elegir?
Carlos P

Para mí, esto no funciona, XCode 6.0.1 iOS 7 iPod Touch
dev

3

Se puede acceder fácilmente a la imagen de lanzamiento mediante una línea de código.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Siga los pasos que se indican a continuación para lograr la funcionalidad descrita anteriormente.

Paso 1. Amplíe laUIImageclase creando una categoría y agregue el siguiente método.

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

Paso 2. El método anterior debería funcionar agregando el siguiente código también en la misma categoría 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 respuesta, gracias!
dortzur

1
¿Cuál es el nombre de la imagen de lanzamiento del iPhone X ahora?
RPM

2

Me doy cuenta de que esta no es necesariamente la mejor solución para todos, pero la forma más fácil (y menos propensa a errores, en mi humilde opinión) de hacerlo es haciendo una entrada separada en su catálogo de Images.xcassets. Lo llamé SplashImage.

Cuando vaya a agregar una nueva entrada, asegúrese de no seleccionar "Nueva imagen de inicio" como una opción. En su lugar, seleccione el "Nuevo conjunto de imágenes" genérico. A continuación, abra el inspector y seleccione las opciones relevantes. Si está compilando solo para dispositivos retina, como yo, puede seleccionar lo siguiente:

inspector de imágenes

Esto te dejará con cuatro entradas (iPhone 4S, iPhone 5 (s, c), iPhone 6 y iPhone 6 Plus).

imagenes

Los archivos correspondientes a las imágenes son los siguientes:

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

Por supuesto, después de hacer esto, simplemente puede usar [UIImage imageNamed:@"SplashImage"]


1
Idea interesante, pero no funciona en iPhone 6. Aún carga la imagen Default@2x.png en el simulador de iPhone 6.
finaliza el

Con este enfoque, también debe tener cuidado con el conjunto de imágenes de lanzamiento para la orientación horizontal.
berec

2

Con la ayuda de la respuesta de Pichirichi, he implementado la siguiente categoría (iOS 7+): UIImage + AssetLaunchImage

En realidad, es poco más que generar un nombre sobre la marcha, pero probablemente sea útil.


0

Actualizado a la última sintaxis de 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
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.