Xcode 5 & Asset Catalog: Bagaimana cara mereferensikan LaunchImage?


102

Saya menggunakan Katalog Aset Xcode 5, dan saya ingin menggunakan my LaunchImagesebagai gambar latar belakang tampilan rumah saya (praktik yang cukup umum untuk membuat transisi dari 'memuat' ke 'dimuat' terlihat mulus).

Saya ingin menggunakan entri yang sama di Katalog Aset untuk menghemat ruang dan tidak perlu mereplikasi gambar dalam dua Kumpulan Gambar yang berbeda.

Namun, menelepon:

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

Jawaban:


83

Ini adalah daftar (hampir) lengkap dari LaunchImage (tidak termasuk gambar iPad tanpa bilah status):

  • 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 (Potret iPhone 6 Plus)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus Landscape)
  • LaunchImage-1100-Portrait-2436h@3x.png (Potret iPhone X)
  • LaunchImage-1100-Landscape-2436h@3x.png (iPhone X Landscape)

Ada yang tahu gambar iPad tanpa bilah status?
Mohamed Hafez

1
@Mohamed Hafez: Pichirichi sebenarnya memasukkan mereka ke dalam daftarnya. Mereka adalah LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png, dan LaunchImage-Landscape@2x~ipad.png.
John Jacecko

Apa arti angka 700 dan 800?
Sound Blaster

2
Saya menangkapnya: artinya iOS 7 & 8
Sound Blaster

4
Sangat menjengkelkan bahwa XCode secara otomatis akan membuat nama file untuk aset gambar ini dan membuat Anda melewati rintangan untuk mencari cara mengaksesnya secara langsung ...
Tn. 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
Bekerja dengan baik. Pendekatan cerdas dan elegan untuk mencari kamus info bundel utama untuk gambar peluncuran yang tersedia dan kemudian memilih salah satu dengan resolusi yang cocok!
iOSX

1
Ini adalah ide yang brilian, lebih baik dari saya dan juga bukti masa depan, kecuali Apple mengubah struktur info.plist.
nonamelive

1
Ini adalah solusi yang sangat cerdas. Saya memiliki banyak target dalam proyek Xcode saya dan hanya menggunakan string LaunchImage tidak selalu mengembalikan gambar yang benar. Terima kasih banyak.
Enrico Susatyo

3
Ide yang brilian. Namun tidak berfungsi untuk layar dengan bilah status buram. Jadi perlu mengubah self.view.bounds.size menjadi [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri

1
Solusi Hebat. Sedikit pengeditan diperlukan: Ada konversi implisit dari UIInterfaceOrientation ke UIDeviceOrientation. Gunakan UIInterfaceOrientationIsLandscape()sebagai gantinya.
Almog C

53

LaunchImages itu spesial, dan sebenarnya bukan katalog aset di perangkat. Jika Anda melihat menggunakan iFunBox / iExplorer / etc (atau pada simulator, atau dalam direktori build) Anda dapat melihat nama akhir, dan kemudian menulis kode untuk menggunakannya - mis. untuk proyek khusus iPhone khusus iOS7, ini akan menetapkan gambar peluncuran yang tepat:

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

Saya memasukkan ini ke viewDidLoad.

Ini tidak terlalu ideal, alangkah baiknya jika Apple memberi kami API yang bagus untuk melakukan ini.


2
Ini berhasil untuk saya, tetapi saya benar-benar berharap ada cara yang lebih sederhana untuk mereferensikan gambar peluncuran.
Zorayr

Mungkin diperbaiki di Xcode 5.0.2 - lihat di bawah, tampaknya berfungsi untuk saya hanya dengan merujuk "LaunchImage.png"
Adam

1
@Adam Akan senang jika itu benar! Saya baru saja mencoba iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] memberi saya nol.
JosephH

@Septianjoko_hh. Mungkin membutuhkan proyek yang baru dibuat? Ini adalah proyek yang dibuat di Xcode 5.0.2, hanya perubahan ke default adalah "ARC dinonaktifkan". Ini bekerja dengan baik :). Saya akan melihat apakah saya dapat menemukan yang lain, tetapi tidak dapat memikirkan apa lagi yang mungkin telah saya ubah
Adam

Saya mencoba kode serupa tetapi menggunakan "Default" dan "Default-568h" (nama file sumber daya asli). Setelah melihat ke dalam bundel aplikasi yang diekspor, saya menyadari bahwa Xcode mengubah nama menjadi "LaunchImage-700 *".
Nicolas Miari

27

Aplikasi saya saat ini hanya mendukung iOS 7 dan yang lebih baru.

Beginilah cara saya mereferensikan gambar peluncuran dari katalog aset:

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

Anda dapat menambahkan lebih banyak pasangan nilai kunci jika Anda ingin mendukung versi iOS yang lebih lama.


1
Perhatikan bahwa memulai dengan iOS 8, UIScreen.mainScreen.boundsberbeda tergantung pada orientasi antarmuka saat ini. Lihat stackoverflow.com/a/24153540/158525
Jean Regisser

1
Terima kasih untuk ini, persis seperti yang saya cari!
Joseph Paterson

Terima kasih untuk htis, metode apa saja untuk mengakses Ikon Aplikasi?
AsifHabib

10

Berikut kategori di UIImage berdasarkan solusi yang diberikan oleh Cherpak Evgeny di atas.

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 mendorong gambar ke cache sistem, tetapi gambar peluncuran terkadang sangat besar, jadi gambar ini ada di memori sampai cache mengosongkannya
Igor Palaguta

9

Jawaban @ codeman diperbarui untuk 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

}

Untuk menyebutnya, dan untuk mendukung rotasi untuk 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)
    }

}

Hanya yang saya butuhkan, terima kasih!


7

Saya baru saja menulis metode umum untuk mendapatkan nama gambar splash untuk iPhone dan iPad (Lansekap, Potret), Ini berhasil untuk saya, Semoga Ini membantu Anda juga. Saya menulis ini dengan bantuan jawaban SO lainnya, terima kasih @Pichirichi untuk seluruh daftar.

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

Metode utilitas lainnya adalah

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

Sebenarnya ada sedikit bug dalam kode ini untuk isDeviceiPhone4: [[UIScreen mainScreen] bounds] sekarang berubah berdasarkan pada orientasi apa Anda berada di bawah iOS 8. Anda harus mengubahnya secara eksplisit menjadi batas potret dengan melakukan sesuatu seperti:, [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]tapi buat pastikan untuk menguji apakah Anda menggunakan iOS 8 terlebih dahulu jika tidak maka akan macet.
Mohamed Hafez

Terima kasih @Hafez karena telah menunjukkannya, saya akan mengujinya untuk iOS 8 dan segera memperbarui jawabannya.
zaheer

7

Versi cepat dari jawaban Cherpak 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

Mengikuti jawaban @ Pichirich, saya mereferensikan gambar peluncuran saya di InterfaceBuilder sebagai:

"LaunchImage.png"

... dan dengan Xcode 5.0.2, itu secara otomatis mengambil gambar yang sesuai langsung dari Katalog Aset.

Inilah yang saya harapkan - kecuali tindakan Apple yang sangat jahat dengan mengganti nama "Default.png" menjadi "LaunchImage.png" :)


Satu hal lagi yang perlu diperhatikan. Ukuran gambar ini harus persis seperti yang direkomendasikan Apple (misalnya 320x480 untuk LaunchImage untuk iOS 5-6 iPhone 3GS), jika tidak maka akan nildiberikan inisialisasi
Alexander Kostiev

3

Dalam dokumentasinya disebutkan dengan jelas:

"Setiap set dalam katalog aset memiliki nama . Anda dapat menggunakan nama itu untuk secara terprogram memuat setiap gambar yang ada dalam set. Untuk memuat gambar, panggil UIImage: ImageNamed: meneruskan nama set yang berisi gambar tersebut . "

Menggunakan daftar Pichirichi membantu mengatasi ketidakkonsistenan ini.


1
Catat bagian "nama set". Melihat katalog aset saya, saya memiliki satu set yang disebut "LaunchImage". Untuk memuat gambar peluncuran, saya menelepon: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Bagus sekali!
leanne

1
Tidak perlu menggunakan daftar Pichirichi (menurut saya itu masih info yang luar biasa untuk diketahui) - cukup gunakan nama "set" katalog aset.
leanne

2
Bagi saya ini tidak berfungsi untuk Launch Image di Xcode 6.0.1 dan iOS 8. LaunchImage tampaknya istimewa karena gambar-gambar tersebut berakhir secara individual dalam bundel aplikasi yang dikompilasi dan tidak tetap berada di dalam folder bundel xcasset.
auco

Apa yang terjadi jika ada dua katalog aset berbeda yang berisi kumpulan dengan nama yang identik? Bagaimana [UIImage imageNamed:..]tahu mana yang harus dipilih?
Carlos P

Bagi saya ini tidak berhasil, XCode 6.0.1 iOS 7 iPod Touch
dev

3

Seseorang dapat dengan mudah mengakses gambar Peluncuran dengan satu baris kode.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Ikuti langkah-langkah yang diberikan di bawah ini untuk mencapai fungsionalitas yang digambarkan di atas.

Langkah 1. PerluasUIImagekelas dengan membuat kategori & tambahkan metode berikut ke dalamnya.

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

Langkah 2. Metode di atas harus bekerja dengan menambahkan kode berikut juga ke dalam kategori yang samaUIImage

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

Jawaban luar biasa, Terima kasih!
dortzur

1
Apa nama gambar peluncuran iPhone X sekarang?
RPM

2

Saya menyadari bahwa ini belum tentu solusi terbaik untuk semua orang, tetapi cara termudah (dan paling tidak rawan kesalahan, IMHO) untuk melakukannya adalah dengan membuat entri terpisah di katalog Images.xcassets Anda. Saya menyebutnya SplashImage.

Saat Anda menambahkan entri baru, pastikan untuk tidak memilih "Gambar Peluncuran Baru" sebagai opsi. Sebaliknya, pilih generik "New Image Set". Selanjutnya, buka inspektur dan pilih opsi yang relevan. Jika Anda membuat hanya untuk perangkat retina, seperti saya sebelumnya, Anda dapat memilih berikut ini:

inspektur gambar

Ini akan memberi Anda empat entri (iPhone 4S, iPhone 5 (s, c), iPhone 6, dan iPhone 6 Plus).

gambar-gambar

File yang sesuai dengan gambar adalah sebagai berikut:

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

Tentu saja, setelah Anda melakukan ini, Anda dapat langsung menggunakannya [UIImage imageNamed:@"SplashImage"]


1
Ide yang menarik, tetapi tidak berhasil pada iPhone 6. Ini masih memuat gambar Default@2x.png pada simulator iPhone 6.
nonamelive

Dengan menggunakan pendekatan ini, Anda juga harus berhati-hati tentang kumpulan gambar peluncuran untuk orientasi lanskap.
berec

2

Dengan bantuan jawaban Pichirichi, saya telah menerapkan kategori berikut (iOS 7+): UIImage + AssetLaunchImage

Ini sebenarnya sedikit lebih dari sekadar menghasilkan nama dengan cepat, tetapi mungkin akan membantu.


0

Diperbarui ke sintaks Swift terbaru (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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.