Xcode 5 i katalog zasobów: jak odwołać się do LaunchImage?

102

Używam Katalogu zasobów Xcode 5 i chciałbym użyć mojego LaunchImagejako obrazu tła mojego widoku głównego (dość powszechna praktyka, aby przejście z „ładowania” do „załadowanego” wyglądało płynnie).

Chciałbym użyć tego samego wpisu w katalogu zasobów, aby zaoszczędzić miejsce i nie musieć replikować obrazu w dwóch różnych zestawach obrazów.

Jednak dzwoniąc:

UIImage *image = [UIImage imageNamed:@"LaunchImage"]; //returns nil
toblerpwn
źródło

Odpowiedzi:

83

Oto (prawie) pełna lista LaunchImage (z wyłączeniem obrazów iPada bez paska stanu):

Pichirichi
źródło
Czy ktoś zna obrazy iPada bez paska stanu?
Mohamed Hafez,
1
@Mohamed Hafez: Pichirichi faktycznie ma je na swojej liście. Są to LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png i LaunchImage-Lcapes@2x~ipad.png.
John Jacecko,
Co oznaczają liczby 700 i 800?
Sound Blaster
2
Złapałem to: to znaczy iOS 7 i 8
Sound Blaster
4
To niesamowicie denerwujące, że XCode automatycznie utworzy nazwę pliku dla tych zasobów obrazu i sprawi, że będziesz przeskakiwać przez obręcze, aby dowiedzieć się, jak uzyskać do nich bezpośredni dostęp ...
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;
}
Cherpak Evgeny
źródło
1
Działa świetnie. Sprytne i eleganckie podejście do przeszukiwania słownika informacyjnego głównego pakietu pod kątem dostępnych obrazów startowych, a następnie wybierania tego o odpowiedniej rozdzielczości!
iOSX
1
To genialny pomysł, lepszy od mojego i przyszłościowy, chyba że Apple zmieni strukturę info.plist.
nonamelive
1
To bardzo sprytne rozwiązanie. Mam wiele celów w moich projektach Xcode i samo użycie ciągu LaunchImage nie zawsze zwraca poprawny obraz. Wielkie dzięki.
Enrico Susatyo
3
Świetny pomysł. Ale nie działa na ekranach z nieprzezroczystym paskiem stanu. Konieczne było więc zmienienie self.view.bounds.size na [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri
1
Świetne rozwiązanie. Wymagana niewielka edycja: istnieje niejawna konwersja z UIInterfaceOrientation do UIDeviceOrientation. Użyj UIInterfaceOrientationIsLandscape()zamiast tego.
Almog C
53

LaunchImages są wyjątkowe i nie są w rzeczywistości katalogiem zasobów na urządzeniu. Jeśli spojrzysz za pomocą iFunBox / iExplorer / etc (lub na symulatorze lub w katalogu kompilacji), możesz zobaczyć ostateczne nazwy, a następnie napisać kod, aby ich użyć - np. w przypadku projektu tylko na iPhone'a z systemem iOS7 spowoduje to ustawienie odpowiedniego obrazu startowego:

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

Włożyłem to do widokuDidLoad.

To nie jest naprawdę idealne, byłoby wspaniale, gdyby Apple dał nam fajny interfejs API, aby to zrobić.

JosephH
źródło
2
U mnie to zadziałało, ale naprawdę chciałbym mieć prostszy sposób odwoływania się do obrazu startowego.
Zorayr
Może naprawiono w Xcode 5.0.2 - patrz poniżej, wydaje mi się, że działa dla mnie po prostu w odniesieniu do „LaunchImage.png”
Adam
1
@Adam Chciałbym, żeby to była prawda! Właśnie wypróbowałem na iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] daje mi zero.
JosephH
@JosephH hmm. Może wymaga nowo utworzonego projektu? To jest projekt utworzony w Xcode 5.0.2, tylko zmiana na domyślne to „wyłączony ARC”. Działa świetnie :). Zobaczę, czy znajdę coś innego, ale nie mogę pomyśleć, co jeszcze mogłem zmienić
Adam
Próbowałem użyć podobnego kodu, ale użyłem „Default” i „Default-568h” (oryginalne nazwy plików zasobów). Po przejrzeniu wyeksportowanego pakietu aplikacji zdałem sobie sprawę, że Xcode zmienia nazwy na „LaunchImage-700 *”.
Nicolas Miari,
27

Moja aplikacja obsługuje obecnie tylko iOS 7 i nowsze.

Oto jak odwołuję się do obrazu startowego z katalogu zasobów:

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

Możesz dodać więcej par klucz-wartość, jeśli chcesz obsługiwać starsze wersje systemu iOS.

nonamelive
źródło
1
Zwróć uwagę, że począwszy od iOS 8, UIScreen.mainScreen.boundsróżni się w zależności od aktualnej orientacji interfejsu. Zobacz stackoverflow.com/a/24153540/158525
Jean Regisser
1
Dzięki za to, dokładnie to, czego szukałem!
Joseph Paterson
Dzięki za htis, jakaś metoda dostępu do ikon aplikacji?
AsifHabib
10

Tutaj kategoria na UIImage oparta na rozwiązaniu zapewnionym przez Cherpak Evgeny powyżej.

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
vilanovi
źródło
imageNamed wypycha obraz do pamięci podręcznej systemu, ale obraz startowy jest czasami bardzo duży, więc pozostaje w pamięci, dopóki go nie
opróżni
9

Odpowiedź @ codeman zaktualizowana dla 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

}

Aby to nazwać i obsługiwać rotację w 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)
    }

}

Właśnie tego potrzebowałem, dzięki!

Anthony Scott
źródło
7

Właśnie napisałem ogólną metodę uzyskiwania nazwy obrazu powitalnego dla iPhone'a i iPada (krajobraz, portret). U mnie zadziałało. Mam nadzieję, że tobie też pomoże. Napisałem to z pomocą innych odpowiedzi SO, dzięki @Pichirichi za całą listę.

+(NSString*)getLaunchImageName
{

 NSArray* images= @[@"LaunchImage.png", @"[email protected]",@"[email protected]",@"[email protected]",@"[email protected]",@"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];
    }
 }
}

Inne metody narzędziowe to

+(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;
}
zaheer
źródło
W tym kodzie faktycznie jest niewielki błąd dla isDeviceiPhone4: [[UIScreen mainScreen] bounds] zmienia się teraz w zależności od orientacji, w jakiej się znajdujesz w iOS 8. Będziesz musiał jawnie przekonwertować go na granice portretu, robiąc coś takiego:, [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]ale zrób najpierw sprawdź, czy korzystasz z iOS 8, w przeciwnym razie ulegnie awarii.
Mohamed Hafez
Dzięki @Hafez za wskazanie tego, przetestuję go na iOS 8 i wkrótce zaktualizuję odpowiedź.
zaheer
7

Szybka wersja odpowiedzi Cherpaka 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 ""
    }
codeman
źródło
5

Idąc za odpowiedzią @ Pichirich, odniosłem się do mojego obrazu startowego w InterfaceBuilder jako:

„LaunchImage.png”

... a dzięki Xcode 5.0.2 automatycznie pobiera odpowiedni obraz prosto z katalogu zasobów.

To jest to, czego bym się spodziewał - z wyjątkiem okrutnie paskudnego posunięcia Apple'a polegającego na cichej zmianie nazwy „Default.png” na „LaunchImage.png” :)

Adam
źródło
Należy zwrócić uwagę na jeszcze jedną rzecz. Rozmiary tych obrazów powinny być dokładnie takie, jakie zaleca Apple (na przykład 320x480 dla LaunchImage dla iOS 5-6 iPhone 3GS), w przeciwnym razie będzie to nilpo danej inicjalizacji
Alexander Kostiev
3

W dokumentacji jest jasno określone:

„Każdy zestaw w katalogu zasobów ma nazwę . Możesz użyć tej nazwy do programowego załadowania dowolnego pojedynczego obrazu zawartego w zestawie. Aby załadować obraz, wywołaj metodę UIImage: ImageNamed:, przekazując nazwę zestawu zawierającego obraz . ”

Korzystanie z listy Pichirichiego pomaga rozwiązać tę niespójność.

Vladimír Slavík
źródło
1
Zwróć uwagę na część „nazwa zestawu”. Patrząc na mój katalog zasobów, mam zestaw o nazwie „LaunchImage”. Aby załadować obraz startowy, zadzwoniłem: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Działa świetnie!
leanne
1
Nie ma potrzeby korzystania z listy Pichirichi (myślę, że to wciąż świetna informacja) - wystarczy użyć nazwy „zestawu” katalogu zasobów.
leanne
2
Cóż, dla mnie to nie działa w przypadku obrazu uruchamiania na Xcode 6.0.1 i iOS 8. LaunchImage wydaje się być wyjątkowy, ponieważ obrazy trafiają pojedynczo do skompilowanego pakietu aplikacji i nie pozostają w folderze pakietu xcasset.
auco
Co się stanie, jeśli istnieją dwa różne katalogi zasobów zawierające zestawy o identycznych nazwach? Skąd miałbyś [UIImage imageNamed:..]wiedzieć, który wybrać?
Carlos P
Dla mnie to nie działa, XCode 6.0.1 iOS 7 iPod Touch
dev
3

Można łatwo uzyskać dostęp do obrazu uruchamiania za pomocą jednej linii kodu.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Aby uzyskać funkcjonalność przedstawioną powyżej, wykonaj czynności podane poniżej.

Krok 1. RozszerzUIImageklasę, tworząc kategorię i dodaj do niej następującą metodę.

+ (UIImage *)launchImage {
    NSDictionary *dOfLaunchImage = [NSDictionary dictionaryWithObjectsAndKeys:
                                    @"[email protected]",@"568,320,2,8,p", // ios 8 - iphone 5 - portrait
                                    @"[email protected]",@"568,320,2,8,l", // ios 8 - iphone 5 - landscape
                                    @"[email protected]",@"568,320,2,7,p", // ios 7 - iphone 5 - portrait
                                    @"[email protected]",@"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
                                    @"[email protected]",@"480,320,2,7,p", // ios 7 - iphone 4/4s retina - portrait
                                    @"[email protected]",@"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
                                    @"[email protected]",@"480,320,2,8,p", // ios 6,7,8 - iphone 4/4s - portrait
                                    @"[email protected]",@"480,320,2,8,l", // ios 6,7,8 - iphone 4/4s - landscape
                                    @"[email protected]",@"667,375,2,8,p", // ios 8 - iphone 6 - portrait
                                    @"[email protected]",@"667,375,2,8,l", // ios 8 - iphone 6 - landscape
                                    @"[email protected]",@"736,414,3,8,p", // ios 8 - iphone 6 plus - portrait
                                    @"[email protected]",@"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;
}

Krok 2. Powyższa metoda powinna działać poprzez dodanie następującego kodu również do tej samej kategoriiUIImage

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;
}
Sagar R. Kothari
źródło
Doskonała odpowiedź, dzięki!
dortzur
1
Jaka jest teraz nazwa obrazu startowego iPhone'a X?
RPM
2

Zdaję sobie sprawę, że niekoniecznie jest to najlepsze rozwiązanie dla wszystkich, ale najłatwiejszym (i najmniej podatnym na błędy, IMHO) sposobem jest wprowadzenie osobnego wpisu w katalogu Images.xcassets. Nazwałem to SplashImage.

Idąc do dodawania nowego wpisu, nie wybieraj opcji „Nowy obraz startowy”. Zamiast tego wybierz ogólny „Nowy zestaw obrazów”. Następnie otwórz inspektora i wybierz odpowiednie opcje. Jeśli tworzysz tylko dla urządzeń Retina, tak jak ja, możesz wybrać następujące opcje:

inspektor obrazów

Zostaną ci cztery wpisy (iPhone 4S, iPhone 5 (s, c), iPhone 6 i iPhone 6 Plus).

zdjęcia

Pliki odpowiadające obrazom są następujące:

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

Oczywiście po wykonaniu tej czynności możesz po prostu użyć [UIImage imageNamed:@"SplashImage"]

Michael DiStefano
źródło
1
Ciekawy pomysł, ale nie działa na iPhonie 6. Nadal ładuje obraz [email protected] na symulatorze iPhone'a 6.
nonamelive
Korzystając z tego podejścia, powinieneś zadbać o zestaw obrazów startowych również dla orientacji poziomej.
berec
2

Z pomocą odpowiedzi Pichirichi zaimplementowałem następującą kategorię (iOS 7+): UIImage + AssetLaunchImage

W rzeczywistości jest to niewiele więcej niż generowanie nazwy w locie, ale prawdopodobnie będzie pomocne.

Timur Kuchkarov
źródło
0

Zaktualizowano do najnowszej składni 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
}
pegpeg
źródło