Xcode 5 & Asset-Katalog: Wie verweise ich auf LaunchImage?


102

Ich verwende den Asset-Katalog von Xcode 5 und möchte meinen LaunchImageals Hintergrundbild für meine Startansicht verwenden (eine übliche Vorgehensweise, um den Übergang von "Laden" zu "Laden" reibungslos zu gestalten).

Ich möchte denselben Eintrag im Asset-Katalog verwenden, um Platz zu sparen, und muss das Bild nicht in zwei verschiedenen Bildsätzen replizieren.

Rufen Sie jedoch an:

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

Antworten:


83

Dies ist die (fast) vollständige Liste des LaunchImage (mit Ausnahme der iPad-Bilder ohne Statusleiste):

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

Kennt jemand die iPad-Bilder ohne Statusleiste?
Mohamed Hafez

1
@Mohamed Hafez: Pichirichi hat sie tatsächlich in seine Liste aufgenommen. Dies sind LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png und LaunchImage-Landscape@2x~ipad.png.
John Jacecko

Was bedeuten die Zahlen 700 und 800?
Sound Blaster

2
Ich habe es verstanden: Es bedeutet iOS 7 & 8
Sound Blaster

4
Es ist unglaublich ärgerlich, dass XCode automatisch einen Dateinamen für diese Bildelemente erstellt und Sie durch die Rahmen springen lässt, um herauszufinden, wie Sie direkt darauf zugreifen können ...
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
Funktioniert super. Cleverer und eleganter Ansatz, um das Info-Wörterbuch des Hauptpakets nach verfügbaren Startbildern zu durchsuchen und dann das mit der passenden Auflösung auszuwählen!
iOSX

1
Dies ist eine brillante Idee, besser als meine und auch zukunftssicher, es sei denn, Apple ändert die Struktur von info.plist.
Nonamelive

1
Dies ist eine sehr clevere Lösung. Ich habe mehrere Ziele in meinen Xcode-Projekten und nur die Verwendung der LaunchImage-Zeichenfolge gibt nicht immer das richtige Bild zurück. Vielen Dank.
Enrico Susatyo

3
Geniale Idee. Funktioniert jedoch nicht für Bildschirme mit undurchsichtiger Statusleiste. Also musste self.view.bounds.size in [UIScreen mainScreen] .bounds.size geändert werden
RamaKrishna Chunduri

1
Tolle Lösung. Kleine Bearbeitung erforderlich: Es gibt eine implizite Konvertierung von UIInterfaceOrientation zu UIDeviceOrientation. Verwenden Sie UIInterfaceOrientationIsLandscape()stattdessen.
Almog C

53

Die LaunchImages sind etwas Besonderes und eigentlich kein Asset-Katalog auf dem Gerät. Wenn Sie mit iFunBox / iExplorer / etc (oder im Simulator oder im Build-Verzeichnis) suchen, können Sie die endgültigen Namen sehen und dann Code schreiben, um sie zu verwenden - z. Für ein iPhone-Projekt nur für iOS7 wird das richtige Startbild festgelegt:

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

Ich habe dies in viewDidLoad eingefügt.

Das ist nicht wirklich ideal, es wäre großartig, wenn Apple uns dafür eine nette API geben würde.


2
Das hat bei mir funktioniert, aber ich wünschte wirklich, es gäbe eine einfachere Möglichkeit, auf das Startbild zu verweisen.
Zorayr

Vielleicht in Xcode 5.0.2 behoben - siehe unten, scheint für mich einfach zu funktionieren, um auf "LaunchImage.png" zu verweisen
Adam

1
@ Adam Würde es lieben, wenn das wahr wäre! Ich habe gerade versucht, iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] gibt mir null.
JosephH

@ JosephH hmm. Vielleicht erfordert es ein neu erstelltes Projekt? Dies ist ein Projekt, das in Xcode 5.0.2 erstellt wurde. Nur die Änderung der Standardeinstellungen war "ARC deaktiviert". Es funktioniert super :). Ich werde sehen, ob ich noch etwas finden kann, aber ich kann mir nicht vorstellen, was ich sonst noch geändert haben könnte
Adam

Ich habe ähnlichen Code ausprobiert, aber "Standard" und "Standard-568h" (die ursprünglichen Namen der Ressourcendateien) verwendet. Nachdem ich mir das exportierte App-Bundle angesehen hatte, stellte ich fest, dass Xcode die Namen in "LaunchImage-700 *" ändert.
Nicolas Miari

27

Meine App unterstützt derzeit nur iOS 7 und höher.

So verweise ich auf das Startabbild aus dem Asset-Katalog:

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

Sie können weitere Schlüsselwertpaare hinzufügen, wenn Sie ältere iOS-Versionen unterstützen möchten.


1
Beachten Sie, dass das Starten mit iOS 8 UIScreen.mainScreen.boundsje nach aktueller Ausrichtung der Benutzeroberfläche unterschiedlich ist. Siehe stackoverflow.com/a/24153540/158525
Jean Regisser

1
Danke dafür, genau das, wonach ich gesucht habe!
Joseph Paterson

Vielen Dank für diese Methode, um auf App-Symbole zuzugreifen?
AsifHabib

10

Hier eine Kategorie zu UIImage, die auf der oben von Cherpak Evgeny bereitgestellten Lösung basiert.

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 schiebt das Bild in den Systemcache, aber das Startbild ist manchmal sehr groß, so dass es sich im Speicher befindet, bis der Cache es
löscht

9

@ codemans Antwort für Swift 1.2 aktualisiert:

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

}

So rufen Sie es auf und unterstützen die Rotation für 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)
    }

}

Genau das, was ich brauchte, danke!


7

Ich habe gerade eine allgemeine Methode geschrieben, um den Namen des Begrüßungsbildes für iPhone und iPad (Landschaft, Hochformat) zu erhalten. Es hat bei mir funktioniert. Ich hoffe, es hilft Ihnen auch. Ich habe dies mit Hilfe anderer SO-Antworten geschrieben, danke @Pichirichi für die ganze Liste.

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

Andere Dienstprogrammmethoden sind

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

Es gibt tatsächlich einen kleinen Fehler in diesem Code für isDeviceiPhone4: [[UIScreen mainScreen] Grenzen] ändert sich jetzt basierend auf der Ausrichtung, in der Sie sich unter iOS 8 befinden. Sie müssen ihn explizit in Porträtgrenzen konvertieren, indem Sie etwas tun wie : [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace], aber machen Testen Sie zuerst, ob Sie iOS 8 verwenden. Andernfalls stürzt das ab.
Mohamed Hafez

Vielen Dank an @Hafez für den Hinweis, ich werde es für iOS 8 testen und die Antwort bald aktualisieren.
Zaheer

7

Schnelle Version von Cherpak Evgenys Antwort:

    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

Nach der Antwort von @ Pichirich habe ich mein Startbild in InterfaceBuilder wie folgt referenziert:

"LaunchImage.png"

... und mit Xcode 5.0.2 wird automatisch das entsprechende Bild direkt aus dem Asset-Katalog abgerufen.

Dies ist, was ich erwarten würde - abgesehen von Apples bösartigem Schritt, "Default.png" stillschweigend in "LaunchImage.png" umzubenennen :)


Eine weitere Sache sollte beachtet werden. Die Größe dieser Bilder sollte genau den Empfehlungen von Apple entsprechen (320 x 480 für LaunchImage für iOS 5-6 iPhone 3GS zum Beispiel), andernfalls wäre dies nilnach der Initialisierung der
Fall

3

In der Dokumentation ist klar angegeben:

"Jeder Satz in einem Asset-Katalog hat einen Namen . Mit diesem Namen können Sie jedes einzelne im Satz enthaltene Bild programmgesteuert laden. Um ein Bild zu laden, rufen Sie die Methode UIImage: ImageNamed: auf und übergeben Sie den Namen des Satzes, der das Bild enthält . "

Die Verwendung von Pichirichis Liste hilft, diese Inkonsistenz zu lösen.


1
Beachten Sie den Teil "Name des Sets". In meinem Asset-Katalog habe ich ein Set namens "LaunchImage". Um das Startbild zu laden, rief ich an: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Funktioniert super!
Leanne

1
Sie müssen Pichirichis Liste nicht verwenden (ich dachte, das sind immer noch großartige Informationen) - verwenden Sie einfach den Namen des "Sets" des Asset-Katalogs.
Leanne

2
Für mich funktioniert dies nicht für das Launch Image unter Xcode 6.0.1 und iOS 8. Das LaunchImage scheint etwas Besonderes zu sein, da die Images einzeln im kompilierten App-Bundle landen und nicht im Ordner des xcasset-Bundles verbleiben.
Auco

Was passiert, wenn zwei verschiedene Asset-Kataloge identisch benannte Sets enthalten? Wie würde man [UIImage imageNamed:..]wissen, welche man auswählen soll?
Carlos P

Für mich funktioniert das nicht, XCode 6.0.1 iOS 7 iPod Touch
dev

3

Sie können einfach über eine Codezeile auf das Startbild zugreifen.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Befolgen Sie die unten angegebenen Schritte, um die oben dargestellte Funktionalität zu erreichen.

Schritt 1. Erweitern Sie dieUIImageKlasse, indem Sie eine Kategorie erstellen und die folgende Methode hinzufügen.

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

Schritt 2. Die obige Methode sollte funktionieren, indem der folgende Code ebenfalls in dieselbe Kategorie von eingefügt wirdUIImage

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

Ausgezeichnete Antwort, danke!
dortzur

1
Wie heißt das iPhone X-Startbild jetzt?
RPM

2

Mir ist klar, dass dies nicht unbedingt die beste Lösung für alle ist, aber der einfachste (und meiner Meinung nach am wenigsten fehleranfällige) Weg, dies zu tun, besteht darin, einen separaten Eintrag in Ihrem Images.xcassets-Katalog vorzunehmen. Ich habe es genannt SplashImage.

Wenn Sie einen neuen Eintrag hinzufügen, stellen Sie sicher, dass Sie nicht "Neues Startbild" als Option auswählen. Wählen Sie stattdessen den generischen "New Image Set". Öffnen Sie als Nächstes den Inspektor und wählen Sie die entsprechenden Optionen aus. Wenn Sie wie ich nur für Retina-Geräte bauen, können Sie Folgendes auswählen:

Bildinspektor

Damit bleiben Ihnen vier Einträge (iPhone 4S, iPhone 5 (s, c), iPhone 6 und iPhone 6 Plus).

Bilder

Die den Bildern entsprechenden Dateien lauten wie folgt:

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

Nachdem Sie dies getan haben, können Sie natürlich einfach verwenden [UIImage imageNamed:@"SplashImage"]


1
Interessante Idee, aber es funktioniert nicht auf dem iPhone 6. Es lädt immer noch das Bild Default@2x.png auf den iPhone 6 Simulator.
Nonamelive

Bei diesem Ansatz sollten Sie sich auch um die Startbilder für die Ausrichtung im Querformat kümmern.
berec


0

Auf die neueste Swift-Syntax aktualisiert (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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.