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

Odpowiedzi:


83

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

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

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

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


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.


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

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!


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", @"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];
    }
 }
}

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

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

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” :)


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ść.


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:
                                    @"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;
}

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

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


1
Ciekawy pomysł, ale nie działa na iPhonie 6. Nadal ładuje obraz Default@2x.png 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


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
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.