Xcode 5 ve Varlık Kataloğu: LaunchImage'a nasıl başvurulur?


102

Xcode 5'in Varlık Kataloğunu kullanıyorum LaunchImageve benim ana görünümümün arka plan görüntüsü olarak kullanmak istiyorum ('yükleme'den' yüklü 'görünüme geçişi sağlamak için oldukça yaygın bir uygulama).

Yer kazanmak ve görüntüyü iki farklı Görüntü Setinde çoğaltmak zorunda kalmamak için Varlık Kataloğunda aynı girişi kullanmak istiyorum.

Ancak, aranıyor:

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

Yanıtlar:


83

Bu, LaunchImage'ın (neredeyse) tam listesidir (durum çubuğu olmayan iPad görüntüleri hariç):

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

Durum çubuğu olmayan iPad görüntülerini bilen var mı?
Mohamed Hafez

1
@Mohamed Hafez: Pichirichi aslında bunları listesine eklemiştir. Bunlar LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png ve LaunchImage-Landscape@2x~ipad.png'dir.
John Jacecko

700 ve 800 sayıları ne anlama geliyor?
Sound Blaster

2
Yakaladım: iOS 7 ve 8 anlamına geliyor
Sound Blaster

4
XCode'un bu görüntü varlıkları için otomatik olarak bir dosya adı oluşturması ve bunlara doğrudan nasıl erişeceğinizi anlamanız için sizi çemberlerden atlatması inanılmaz derecede sinir bozucu ...
Bay 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
Harika çalışıyor. Mevcut başlatma görüntüleri için ana paketin bilgi sözlüğünü aramak ve ardından eşleşen çözünürlüğe sahip olanı seçmek için akıllı ve zarif bir yaklaşım!
iOSX

1
Apple info.plist'in yapısını değiştirmediği sürece, bu harika bir fikir, benimkinden daha iyi ve aynı zamanda gelecekteki kanıtı.
nonamelive

1
Bu çok akıllıca bir çözüm. Xcode projelerimde birden fazla hedefim var ve sadece LaunchImage dizesini kullanmak her zaman doğru görüntüyü döndürmüyor. Çok teşekkürler.
Enrico Susatyo

3
Yine de harika bir fikir. Ancak opak durum çubuğuna sahip ekranlarda çalışmaz. Bu yüzden self.view.bounds.size değerini [UIScreen mainScreen] .bounds.size olarak değiştirmek gerekiyor
RamaKrishna Chunduri

1
Harika Çözüm. Küçük düzenleme gerekli: UIInterfaceOrientation'dan UIDeviceOrientation'a örtük bir dönüştürme var. UIInterfaceOrientationIsLandscape()Bunun yerine kullanın .
Almog C

53

LaunchImages özeldir ve aslında cihazda bir varlık kataloğu değildir. İFunBox / iExplorer / etc (veya simülatörde veya derleme dizininde) kullanarak bakarsanız, son adları görebilir ve sonra bunları kullanmak için kod yazabilirsiniz - ör. Yalnızca iOS7'ye özel bir iPhone projesi için bu, doğru başlatma görüntüsünü ayarlar:

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

Bunu viewDidLoad'a koydum.

Bu gerçekten ideal değil, Apple bunu yapmak için bize güzel bir API verirse harika olurdu.


2
Bu benim için işe yaradı, ancak keşke fırlatma görüntüsünü referans almanın daha basit bir yolu olsaydı.
Zorayr

Belki Xcode 5.0.2'de düzeltildi - aşağıya bakın, benim için sadece "LaunchImage.png" ye başvurmak için işe yarıyor gibi görünüyor
Adam

1
@Adam Bu doğru olsaydı çok isterdim! İphone5s / xcode5.0.2 / ios7.0.4 üzerinde denedim, [UIImage imageNamed: @ "LaunchImage.png"] bana sıfır veriyor.
JosephH

@JosephH hmm. Belki yeni oluşturulmuş bir proje gerektirir? Bu, Xcode 5.0.2'de oluşturulmuş bir projedir, yalnızca varsayılanlara yapılan değişiklik "devre dışı bırakılmış ARC" idi. Harika çalışıyor :). Bakacağım başka bir şey bulabilir miyim, ama başka neyi değiştirmiş olabileceğimi düşünemiyorum
Adam

Benzer kodu deniyordum ama "Varsayılan" ve "Varsayılan-568h" (orijinal kaynak dosya adları) kullanıyordum. Dışa aktarılan uygulama paketinin içine baktıktan sonra, Xcode'un adları "LaunchImage-700 *" olarak değiştirdiğini fark ettim.
Nicolas Miari

27

Uygulamam şu anda yalnızca iOS 7 ve sonraki sürümleri destekliyor.

Varlık kataloğundaki başlatma görüntüsüne şu şekilde referans veriyorum:

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

Daha eski iOS sürümlerini desteklemek istiyorsanız daha fazla anahtar değer çifti ekleyebilirsiniz.


1
İOS 8 ile başlamanın UIScreen.mainScreen.boundsmevcut arayüz yönüne bağlı olarak farklı olduğunu unutmayın . Bkz stackoverflow.com/a/24153540/158525
Jean Regisser

1
Bunun için teşekkürler, tam olarak aradığım şey!
Joseph Paterson

Htis için teşekkürler, Uygulama Simgelerine erişmek için herhangi bir yöntem var mı?
AsifHabib

10

Yukarıdaki Cherpak Evgeny tarafından sağlanan çözüme dayalı UIImage üzerinde bir kategori.

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, görüntüyü sistem önbelleğine iter, ancak başlatma görüntüsü bazen çok büyüktür, bu nedenle önbellek onu
temizleyene

9

@ codeman'ın cevabı Swift 1.2 için güncellendi:

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

}

Onu çağırmak ve iOS 8 için rotasyonu desteklemek için:

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

}

Tam ihtiyacım olan şey, teşekkürler!


7

Sadece iPhone ve iPad için açılış görüntüsü adını almak için genel bir yöntem yazdım (Manzara, Portre), Benim için çalıştı, Umarım sana da yardımcı olur. Bunu diğer SO cevaplarının yardımıyla yazdım, tüm liste için @ Pichirichi'ye teşekkürler.

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

Diğer yardımcı yöntemler şunlardır

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

[[UIScreen mainScreen] sınırları] şimdi iOS 8. altında açıkça böyle bir şey yaptığını bir portre sınırları dönüştürmek gerekir içindedir yönlendirmesinin ne dayalı değiştirir:: isDeviceiPhone4 için bu kodda hafif hata aslında var [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]ama marka İlk önce iOS 8'de olup olmadığınızı test ettiğinizden emin olun, aksi takdirde bu çökecektir.
Mohamed Hafez

Bunu belirttiğiniz için teşekkürler @Hafez, iOS 8 için test edeceğim ve yanıtı yakında güncelleyeceğim.
zaheer

7

Cherpak Evgeny'nin cevabının hızlı versiyonu:

    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

@ Pichirich'in cevabının ardından, InterfaceBuilder'daki launchimage'e şu şekilde başvurdum:

"LaunchImage.png"

... ve Xcode 5.0.2 ile, uygun görüntüyü otomatik olarak doğrudan Varlık Kataloğundan çıkarır.

Beklediğim şey bu - Apple'ın sessizce "Default.png" adını "LaunchImage.png" olarak yeniden adlandırması haricinde :)


Bir şeye daha dikkat edilmelidir. Bu resimlerin boyutları tam olarak Apple'ın önerdiği gibi olmalıdır (örneğin, iOS 5-6 iPhone 3GS için LaunchImage için 320x480), aksi takdirde nilbaşlatma verildikten sonra olur
Alexander Kostiev

3

Gelen belgeler açıkça orada belirtilmiştir:

"Bir varlık kataloğundaki her kümenin bir adı vardır . Bu adı , kümede bulunan herhangi bir görüntüyü programlı olarak yüklemek için kullanabilirsiniz . Bir görüntüyü yüklemek için , görüntüyü içeren kümenin adını ileterek UIImage: ImageNamed: yöntemini çağırın . "

Pichirichi'nin listesini kullanmak bu tutarsızlığı çözmeye yardımcı olur.


1
"Setin adı" bölümüne dikkat edin. Varlık kataloğuma baktığımda, "LaunchImage" adında bir setim var. Başlatma görüntüsünü yüklemek için aradım: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Harika çalışıyor!
leanne

1
Pichirichi'nin listesini kullanmaya gerek yok (bunun hala harika bir bilgi olduğu düşünülüyor) - sadece varlık kataloğunun "set" adını kullanın.
leanne

2
Benim için bu, Xcode 6.0.1 ve iOS 8'deki Başlatma Görüntüsü için çalışmıyor. Görüntüler derlenen uygulama paketinde ayrı ayrı sona erdiği ve xcasset paketi klasöründe kalmadığı için LaunchImage özel görünüyor.
auco

Aynı adlandırılmış kümeleri içeren iki farklı varlık kataloğu varsa ne olur? [UIImage imageNamed:..]Hangisini seçeceğinizi nasıl bileceksiniz?
Carlos P

Benim için bu iş değil, XCode 6.0.1 iOS 7 iPod Touch
dev

3

Başlatma görüntüsüne bir kod satırı ile kolayca erişebilirsiniz.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Yukarıda tasvir edilen işlevselliği elde etmek için lütfen aşağıda verilen adımları izleyin.

Adım 1.UIImage Bir kategori oluşturarak sınıfıgenişletinve buna aşağıdaki yöntemi ekleyin.

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

Adım 2. Yukarıdaki yöntem, aşağıdaki kodu da aynı kategoriye ekleyerek çalışmalıdır.UIImage

static inline double radians (double degrees) {return degrees * M_PI/180;}

+ (UIImage *)rotate:(UIImage*)src orientation:(UIImageOrientation) orientation {
    UIGraphicsBeginImageContext(src.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    if (orientation == UIImageOrientationRight) {
        CGContextRotateCTM (context, radians(90));
    } else if (orientation == UIImageOrientationLeft) {
        CGContextRotateCTM (context, radians(-90));
    } else if (orientation == UIImageOrientationDown) {
        // NOTHING
    } else if (orientation == UIImageOrientationUp) {
        CGContextRotateCTM (context, radians(90));
    }
    [src drawAtPoint:CGPointMake(0, 0)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

Mükemmel cevap, teşekkürler!
dortzur

1
Şimdi iPhone X lansman görüntüsünün adı nedir?
RPM

2

Bunun herkes için en iyi çözüm olmadığının farkındayım, ancak bunu yapmanın en kolay (ve en az hataya açık, IMHO) yolu Images.xcassets kataloğunuza ayrı bir giriş yapmaktır. Ben aradım SplashImage.

Yeni bir giriş eklemek için gittiğinizde, emin değil bir seçenek olarak "Yeni Lansman Image" seçiniz. Bunun yerine, genel "Yeni Görüntü Kümesi" ni seçin. Ardından, denetçiyi açın ve ilgili seçenekleri seçin. Eskiden olduğu gibi yalnızca retina cihazları için geliştirme yapıyorsanız, aşağıdakileri seçebilirsiniz:

görüntü müfettişi

Bu size dört giriş (iPhone 4S, iPhone 5 (s, c), iPhone 6 ve iPhone 6 Plus) bırakacaktır.

Görüntüler

Görüntülere karşılık gelen dosyalar aşağıdaki gibidir:

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

Elbette, bunu yaptıktan sonra kullanabilirsiniz [UIImage imageNamed:@"SplashImage"]


1
İlginç bir fikir, ancak iPhone 6'da çalışmıyor. Default@2x.png görüntüsünü iPhone 6 simülatörüne yüklemeye devam ediyor.
amelif olmayan

Bu yaklaşımı kullanırken, aynı zamanda yatay yönlendirme için bir dizi başlatma görüntüsüne de dikkat etmelisiniz.
berec


0

En son Swift sözdizimine güncellendi (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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.