Xcode 5 & Каталог активів: Як посилатися на LaunchImage?


102

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

Я хотів би використовувати один і той же запис у каталозі активів, щоб заощадити простір і не потрібно копіювати зображення у двох різних наборах зображень.

Однак зателефонувавши:

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

Відповіді:


83

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

  • LaunchImage-568h@2x.png
  • LaunchImage-700-568h@2x.png
  • LaunchImage-700-Landscape@2x~ipad.png
  • LaunchImage-700-Landscape ~ ipad.png
  • LaunchImage-700-Por Portrait@2x~ipad.png
  • LaunchImage-700-Portrait ~ ipad.png
  • LaunchImage-700@2x.png
  • LaunchImage-Landscape@2x~ipad.png
  • LaunchImage-Landscape ~ ipad.png
  • LaunchImage-Por Portrait@2x~ipad.png
  • LaunchImage-Portrait ~ ipad.png
  • LaunchImage.png
  • LaunchImage@2x.png
  • LaunchImage-800-667h@2x.png (iPhone 6)
  • LaunchImage-800-Por Portrait-736h@3x.png (портрет iPhone 6 Plus)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus Landscape)
  • LaunchImage-1100-Por Portrait-2436h@3x.png (портрет iPhone X)
  • LaunchImage-1100-Landscape-2436h@3x.png (iPhone X Landscape)

Хтось знає зображення iPad без смужки стану?
Мохамед Хафез

1
@Mohamed Hafez: Пічірічі насправді їх включили до свого списку. Вони - LaunchImage-Portrait ~ ipad.png, LaunchImage-Por Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png та LaunchImage-Landscape@2x~ipad.png.
Джон Яцечко

Що означають числа 700 і 800?
Sound Blaster

2
Я наздогнав це: це означає, що iOS 7 & 8
Sound Blaster

4
Це неймовірно дратує , що XCode автоматично створить ім'я файлу для цих зображень активів і змусить вас стрибати через обручі , щоб з'ясувати , як безпосередньо звертатися до них ...
Г - н 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
Чудово працює. Розумний та елегантний підхід до пошуку словника інформації основного пакета для наявних запуску зображень, а потім вибору одного з відповідним дозволом!
iOSX

1
Це геніальна ідея, краща, ніж моя, а також майбутня доказ, якщо Apple не змінить структуру info.plist.
nonamelive

1
Це дуже розумне рішення. У моїх проектах Xcode є кілька цілей, і лише використання рядка LaunchImage не завжди повертає правильне зображення. Дуже дякую.
Енріко Сусатіо

3
Але геніальна ідея. Але не працює для екранів із непрозорою смугою стану. Тому потрібно змінити self.view.bounds.size на [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri

1
Чудове рішення. Потрібно невелике редагування. Існує неявна конверсія з UIInterfaceOrientation в UIDeviceOrientation. Використовуйте UIInterfaceOrientationIsLandscape()замість цього.
Almog C

53

LaunchImages є особливими і насправді не є каталогом активів на пристрої. Якщо ви шукаєте за допомогою iFunBox / iExplorer / тощо (або на тренажері, або в каталозі збірки), ви можете побачити кінцеві імена, а потім написати код для їх використання - наприклад. для iOS7-лише проекту iPhone, це встановить правильне зображення запуску:

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 для цього.


2
Це працювало для мене, але мені дуже хочеться, щоб існував простіший спосіб відношення зображення до запуску.
Зорайр

Можливо, виправлено в Xcode 5.0.2 - див. Нижче, здається, для мене працює просто посилання на "LaunchImage.png"
Адам

1
@Adam Дуже хотілося б, якби це було правдою! Я щойно спробував на iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] дає мені нуль.
Йосиф Г

@JosephH хм. Може, для цього потрібен новостворений проект? Це проект, створений в Xcode 5.0.2, лише зміна за замовчуванням була "відключена ARC". Це чудово працює :). Я побачу, чи зможу я знайти щось інше, але не можу подумати, що ще я міг би змінити
Адам

Я намагався подібний код, але використовував "За замовчуванням" та "За замовчуванням-568h" (оригінальні назви файлів ресурсів). Заглянувши всередину експортованого пакету додатків, я зрозумів, що Xcode змінює назви на "LaunchImage-700 *".
Nicolas Miari

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.


1
Зауважте, що починаючи з iOS 8, UIScreen.mainScreen.boundsвідрізняється залежно від поточної орієнтації інтерфейсу. Див stackoverflow.com/a/24153540/158525
Жан Regisser

1
Дякую за це, саме те, що я шукав!
Джозеф Патерсон

Дякуємо за htis, будь-який метод доступу до іконок додатків?
АсіфХабіб

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] межі] тепер змінюється залежно від того, яку орієнтацію ви перебуваєте під 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

Після відповіді @ Пічіріха я назвав свій стартовий знімок в 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:..]знати, кого вибрати?
Карлос П

Для мене це не робота, XCode 6.0.1 IOS 7 IPod Touch
DEV

3

Можна легко отримати доступ до зображення Launch за одним рядком коду.

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

Відмінна відповідь, спасибі!
Дорцур

1
Як називається зображення для запуску iPhone X зараз?
RPM

2

Я усвідомлюю, що це не обов'язково найкраще рішення для всіх, але найпростіший (і найменш схильний до помилок IMHO) спосіб зробити це, зробивши окремий запис у вашому каталозі Images.xcassets. Я це назвав SplashImage.

Коли ви збираєтеся додати нову запис, переконайтеся, що не вибирайте опцію "Новий запуск зображення". Замість цього виберіть загальний "Новий набір зображень". Далі відкрийте інспектора та виберіть відповідні параметри. Якщо ви будуєте лише пристрої сітківки, як я, ви можете вибрати наступне:

інспектор зображень

Це дозволить отримати чотири записи (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. Вона все ще завантажує зображення за замовчуванням@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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.