Xcode 5 и каталог активов: как ссылаться на LaunchImage?

102

Я использую каталог активов Xcode 5, и я хотел бы использовать мой LaunchImageв качестве фонового изображения моего домашнего представления (довольно распространенная практика, позволяющая сделать переход от «загрузки» к «загруженному» более плавным).

Я хотел бы использовать одну и ту же запись в каталоге активов для экономии места и не дублировать изображение в двух разных наборах изображений.

Однако звонки:

UIImage *image = [UIImage imageNamed:@"LaunchImage"]; //returns nil
Toblerpwn
источник

Ответы:

83

Это (почти) полный список LaunchImage (за исключением изображений iPad без строки состояния):

  • LaunchImage-568h@2x.png
  • LaunchImage-700-568h@2x.png
  • LaunchImage-700-Landscape@2x~ipad.png
  • LaunchImage-700-Пейзаж ~ ipad.png
  • LaunchImage-700-Portrait@2x~ipad.png
  • LaunchImage-700-Portrait ~ ipad.png
  • LaunchImage-700@2x.png
  • LaunchImage-Landscape@2x~ipad.png
  • LaunchImage-Landscape ~ ipad.png
  • LaunchImage-Portrait@2x~ipad.png
  • LaunchImage-Portrait ~ ipad.png
  • LaunchImage.png
  • LaunchImage@2x.png
  • LaunchImage-800-667h@2x.png (iPhone 6)
  • LaunchImage-800-Portrait-736h@3x.png (iPhone 6 Plus Portrait)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus, альбомная ориентация)
  • LaunchImage-1100-Portrait-2436h@3x.png (iPhone X Portrait)
  • LaunchImage-1100-Landscape-2436h@3x.png (iPhone X, пейзаж)
Пичиричи
источник
Кто-нибудь знает изображения iPad без строки состояния?
Мохамед Хафез
1
@ Мохамед Хафез: Пичиричи действительно включил их в свой список. Это LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png и LaunchImage-Landscape@2x~ipad.png.
John Jacecko
Что означают числа 700 и 800?
Sound Blaster
2
Ловил: значит iOS 7 и 8
Sound Blaster
4
Невероятно раздражает то, что XCode автоматически создает имя файла для этих ресурсов изображения и заставляет вас прыгать через обручи, чтобы выяснить, как получить к ним прямой доступ ...
Мистер Т.
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
Прекрасно работает. Умный и элегантный подход к поиску доступных изображений запуска в информационном словаре основного пакета и последующему выбору изображения с подходящим разрешением!
iOSX
1
Это блестящая идея, лучше, чем моя, и на будущее, если Apple не изменит структуру info.plist.
nonamelive
1
Это очень умное решение. У меня есть несколько целей в моих проектах Xcode, и простое использование строки LaunchImage не всегда возвращает правильное изображение. Большое спасибо.
Enrico Susatyo
3
Но блестящая идея. Но не работает для экранов с непрозрачной строкой состояния. Поэтому необходимо изменить self.view.bounds.size на [UIScreen mainScreen] .bounds.size
РамаКришна Чундури
1
Отличное решение. Требуется небольшая правка: существует неявное преобразование из UIInterfaceOrientation в UIDeviceOrientation. UIInterfaceOrientationIsLandscape()Вместо этого используйте .
Almog C
53

LaunchImages особенные и на самом деле не являются каталогом активов на устройстве. Если вы посмотрите с помощью iFunBox / iExplorer / etc (или на симуляторе, или в каталоге сборки), вы можете увидеть окончательные имена, а затем написать код для их использования - например. для проекта только для iPhone, предназначенного только для iOS7, это установит правильное изображение для запуска:

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

Я поместил это в viewDidLoad.

Это не совсем идеально, было бы здорово, если бы Apple предоставила нам хороший API для этого.

JosephH
источник
2
Это сработало для меня, но я действительно хотел бы, чтобы был более простой способ ссылки на изображение запуска.
Зорайр 07
Возможно, исправлено в Xcode 5.0.2 - см. Ниже, мне кажется, что я просто ссылаюсь на "LaunchImage.png"
Адам
1
@ Адам Был бы рад, если бы это было правдой! Я только что пробовал на iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] дает мне ноль.
JosephH
@JosephH хм. Может, нужен только что созданный проект? Это проект, созданный в Xcode 5.0.2, только изменение значений по умолчанию было «отключено ARC». Работает отлично :). Я посмотрю, смогу ли я найти что-нибудь еще, но не могу придумать, что еще я мог изменить
Адам
Я пробовал аналогичный код, но использовал «Default» и «Default-568h» (исходные имена файлов ресурсов). Заглянув внутрь экспортированного пакета приложений, я понял, что Xcode меняет имена на «LaunchImage-700 *».
Николас Миари
27

В настоящее время мое приложение поддерживает только iOS 7 и новее.

Вот как я ссылаюсь на изображение запуска из каталога активов:

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

Вы можете добавить больше пар ключ-значение, если хотите поддерживать более старые версии iOS.

nonamelive
источник
1
Обратите внимание, что начиная с iOS 8, UIScreen.mainScreen.boundsвсе зависит от текущей ориентации интерфейса. См stackoverflow.com/a/24153540/158525
Жан Regisser
1
Спасибо за это, именно то, что я искал!
Джозеф Патерсон
Спасибо за htis, есть ли способ получить доступ к значкам приложений?
AsifHabib
10

Здесь категория на UIImage, основанная на решении, предоставленном Черпаком Евгением выше.

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 помещает изображение в системный кеш, но изображение запуска иногда бывает очень большим, поэтому оно находится в памяти, пока кеш не очистит его
Игорь Палагута
9

Ответ @ codeman обновлен для 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

}

Чтобы вызвать это и поддержать ротацию для 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)
    }

}

Как раз то, что мне нужно, спасибо!

Энтони Скотт
источник
7

Я просто написал общий метод получения имени заставки для iPhone и iPad (пейзаж, портрет). У меня это сработало, надеюсь, это поможет и вам. Я написал это с помощью других ответов SO, спасибо @Pichirichi за весь список.

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

Другие служебные методы:

+(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;
}
Захир
источник
На самом деле в этом коде для isDeviceiPhone4 есть небольшая ошибка: [[UIScreen mainScreen] bounds] теперь изменяется в зависимости от того, в какой ориентации вы находитесь под iOS 8. Вам нужно будет явно преобразовать его в портретные границы, выполнив что-то вроде:, [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]но сделайте Обязательно сначала проверьте, используете ли вы iOS 8, иначе произойдет сбой.
Мохамед Хафез
Спасибо @Hafez за указание на это, я протестирую его для iOS 8 и скоро обновлю ответ.
zaheer
7

Быстрая версия ответа Черпака Евгения:

    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

После ответа @Pichirich я сослался на свое изображение запуска в InterfaceBuilder как:

"LaunchImage.png"

... а с Xcode 5.0.2 он автоматически извлекает соответствующий образ прямо из каталога активов.

Это то, что я ожидал - за исключением злобно мерзкого шага Apple, который молча переименовал "Default.png" в "LaunchImage.png" :)

Адам
источник
Следует отметить еще один момент. Размеры этих изображений должны быть точно такими, как рекомендует Apple (например, 320x480 для LaunchImage для iOS 5-6 iPhone 3GS), иначе они будут nilпосле данной инициализации
Александр Костиев
3

В документации четко указано:

"У каждого набора в каталоге ресурсов есть имя . Вы можете использовать это имя для программной загрузки любого отдельного изображения, содержащегося в наборе. Чтобы загрузить изображение, вызовите метод UIImage: ImageNamed:, передав имя набора, который содержит изображение . "

Использование списка Пичиричи помогает разрешить это несоответствие.

Владимир Славик
источник
1
Обратите внимание на часть «название набора». Глядя на свой каталог активов, у меня есть набор под названием «LaunchImage». Чтобы загрузить стартовое изображение, я позвонил: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Отлично работает!
Leanne
1
Нет необходимости использовать список Пичиричи (подумал, что это все еще отличная информация) - просто используйте имя «набора» каталога активов.
Leanne
2
Что ж, для меня это не работает для Launch Image в Xcode 6.0.1 и iOS 8. LaunchImage кажется особенным, поскольку изображения попадают индивидуально в скомпилированный пакет приложений и не остаются в папке пакета xcasset.
auco
Что произойдет, если есть два разных каталога активов, содержащих наборы с одинаковыми именами? Как [UIImage imageNamed:..]узнать, какой выбрать?
Carlos P
Для меня это не работает, XCode 6.0.1 iOS 7 iPod Touch
dev
3

Получить доступ к изображению запуска можно с помощью одной строчки кода.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Пожалуйста, следуйте инструкциям ниже, чтобы достичь функциональности, описанной выше.

Шаг 1. РасширитьUIImageкласс, создав категорию и добавив к ней следующий метод.

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

Шаг 2. Вышеуказанный метод должен работать, добавляя следующий код также в ту же категориюUIImage

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;
}
Сагар Р. Котари
источник
Отличный ответ, спасибо!
dortzur
1
Как теперь называется стартовая картинка iPhone X?
RPM
2

Я понимаю, что это не обязательно лучшее решение для всех, но самый простой (и наименее подверженный ошибкам, IMHO) способ сделать это - сделать отдельную запись в вашем каталоге Images.xcassets. Я назвал это SplashImage.

Когда вы собираетесь добавить новую запись, убедитесь, что не выбрали вариант «Новое изображение для запуска». Вместо этого выберите общий «Новый набор изображений». Затем откройте инспектор и выберите соответствующие параметры. Если вы строите только устройства Retina, как я, вы можете выбрать следующее:

инспектор изображений

У вас останется четыре записи (iPhone 4S, iPhone 5 (s, c), iPhone 6 и iPhone 6 Plus).

изображений

Файлы, соответствующие изображениям, следующие:

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

Конечно, после того, как вы это сделаете, вы можете просто использовать [UIImage imageNamed:@"SplashImage"]

Майкл ДиСтефано
источник
1
Интересная идея, но она не работает на iPhone 6. Он по-прежнему загружает изображение Default@2x.png в симулятор iPhone 6.
nonamelive
При таком подходе вам также следует позаботиться о наборе запускаемых изображений для альбомной ориентации.
berec
2

С помощью ответа Пичиричи я реализовал следующую категорию (iOS 7+): UIImage + AssetLaunchImage

На самом деле это немного больше, чем создание имени на лету, но, вероятно, будет полезно.

Тимур Кучкаров
источник
0

Обновлен до последней версии синтаксиса 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
}
привязка
источник