Xcode 5 & Asset Catalog: จะอ้างอิง LaunchImage ได้อย่างไร?


102

ฉันใช้แคตตาล็อกสินทรัพย์ของ Xcode 5 และฉันต้องการใช้LaunchImageเป็นภาพพื้นหลังของมุมมองที่บ้านของฉัน (ซึ่งเป็นแนวทางปฏิบัติทั่วไปในการเปลี่ยนจาก 'โหลด' เป็น 'โหลด' ดูราบรื่น)

ฉันต้องการใช้รายการเดียวกันในแค็ตตาล็อกเนื้อหาเพื่อประหยัดพื้นที่และไม่ต้องจำลองภาพในชุดรูปภาพสองชุดที่แตกต่างกัน

อย่างไรก็ตามการโทร:

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

คำตอบ:


83

นี่คือรายการ (เกือบ) ทั้งหมดของ LaunchImage (ไม่รวมภาพ iPad ที่ไม่มีแถบสถานะ):

  • LaunchImage-568h@2x.png
  • LaunchImage-700-568h@2x.png
  • LaunchImage-700-Landscape@2x~ipad.png
  • LaunchImage-700- แนวนอน ~ ipad.png
  • LaunchImage-700-Portrait@2x~ipad.png
  • LaunchImage-700- แนวตั้ง ~ 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)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus แนวนอน)
  • LaunchImage-1100-Portrait-2436h@3x.png (ภาพบุคคล iPhone X)
  • LaunchImage-1100-Landscape-2436h@3x.png (แนวนอน iPhone X)

มีใครรู้จักภาพ iPad ที่ไม่มีแถบสถานะ?
Mohamed Hafez

1
@ Mohamed Hafez: Pichirichi มีพวกเขารวมอยู่ในรายการของเขาด้วย ได้แก่ LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png และ LaunchImage-Landscape@2x~ipad.png
John Jacecko

ตัวเลข 700 และ 800 หมายถึงอะไร?
Sound Blaster

2
ฉันจับได้มันหมายถึง iOS 7 & 8
Sound Blaster

4
มันน่ารำคาญอย่างมากที่ XCode จะสร้างชื่อไฟล์สำหรับเนื้อหารูปภาพเหล่านี้โดยอัตโนมัติและทำให้คุณกระโดดผ่านห่วงเพื่อหาวิธีเข้าถึงโดยตรง ...
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
ใช้งานได้ดี วิธีการที่ชาญฉลาดและสง่างามในการค้นหาพจนานุกรมข้อมูลของกลุ่มหลักสำหรับภาพเปิดตัวที่มีอยู่แล้วเลือกอันที่มีความละเอียดที่ตรงกัน
iOSX

1
นี่เป็นความคิดที่ยอดเยี่ยมดีกว่าของฉันและยังเป็นข้อพิสูจน์ในอนาคตเว้นแต่ Apple จะเปลี่ยนโครงสร้างของ info.plist
nonamelive

1
นี่เป็นวิธีการแก้ปัญหาที่ชาญฉลาดมาก ฉันมีหลายเป้าหมายในโปรเจ็กต์ Xcode ของฉันและเพียงแค่ใช้สตริง LaunchImage ก็ไม่ได้ส่งคืนรูปภาพที่ถูกต้องเสมอไป ขอบคุณมาก.
Enrico Susatyo

3
ความคิดที่ยอดเยี่ยมแม้ว่า แต่ไม่สามารถใช้ได้กับหน้าจอที่มีแถบสถานะทึบแสง จึงจำเป็นต้องเปลี่ยน self.view.bounds.size เป็น [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri

1
ทางออกที่ดี จำเป็นต้องแก้ไขเล็กน้อย: มีการแปลงโดยนัยจาก UIInterfaceOrientation เป็น UIDeviceOrientation ใช้UIInterfaceOrientationIsLandscape()แทน
Almog C

53

LaunchImages เป็นแบบพิเศษและไม่ได้เป็นแคตตาล็อกเนื้อหาบนอุปกรณ์ หากคุณดูโดยใช้ iFunBox / iExplorer / etc (หรือบนโปรแกรมจำลองหรือในไดเร็กทอรีบิลด์) คุณจะเห็นชื่อสุดท้ายจากนั้นเขียนโค้ดเพื่อใช้ - เช่น สำหรับโปรเจ็กต์เฉพาะ iPhone ที่ใช้ iOS7 เท่านั้นสิ่งนี้จะตั้งค่ารูปภาพเปิดตัวที่ถูกต้อง:

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

ฉันใส่สิ่งนี้ลงใน viewDidLoad

สิ่งนี้ไม่เหมาะจริงๆมันจะดีมากถ้า Apple จะให้ API ที่ดีแก่เราในการทำสิ่งนี้


2
สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่ฉันหวังว่าจะมีวิธีการอ้างอิงภาพเปิดตัวที่ง่ายกว่านี้
Zorayr

อาจได้รับการแก้ไขใน Xcode 5.0.2 - ดูด้านล่างดูเหมือนว่าจะใช้ได้สำหรับฉันเพียงแค่อ้างอิง "LaunchImage.png"
อดัม

1
@ อดัมจะรักถ้านั่นเป็นเรื่องจริง! ฉันเพิ่งลองบน iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] ทำให้ฉันไม่มีอะไร
JosephH

@ โจเซฟฮืม อาจต้องใช้โครงการที่สร้างขึ้นใหม่หรือไม่? นี่เป็นโปรเจ็กต์ที่สร้างขึ้นใน Xcode 5.0.2 การเปลี่ยนเป็นค่าเริ่มต้นเท่านั้นคือ "ปิดใช้งาน ARC" มันใช้งานได้ดี :) ฉันจะดูว่าฉันจะพบอะไรอีกหรือไม่ แต่คิดไม่ออกว่าจะมีอะไรเปลี่ยนแปลงอีกบ้าง
อดัม

ฉันกำลังลองใช้รหัสที่คล้ายกัน แต่ใช้ "Default" และ "Default-568h" (ชื่อไฟล์ทรัพยากรดั้งเดิม) หลังจากดูภายใน App Bundle ที่ส่งออกฉันก็รู้ว่า Xcode เปลี่ยนชื่อเป็น "LaunchImage-700 *"
Nicolas Miari

27

ขณะนี้แอปของฉันรองรับเฉพาะ iOS 7 และใหม่กว่า

นี่คือวิธีที่ฉันอ้างอิงภาพเปิดตัวจากแคตตาล็อกเนื้อหา:

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

คุณสามารถเพิ่มคู่คีย์ค่าอื่น ๆ ได้หากต้องการรองรับ iOS เวอร์ชันเก่า


1
โปรดทราบว่าการเริ่มต้นด้วย iOS 8 UIScreen.mainScreen.boundsจะแตกต่างกันไปตามการวางแนวอินเทอร์เฟซปัจจุบัน ดูstackoverflow.com/a/24153540/158525
Jean Regisser

1
ขอบคุณสำหรับสิ่งนี้สิ่งที่ฉันกำลังมองหา!
Joseph Paterson

ขอบคุณสำหรับ htis วิธีใด ๆ ในการเข้าถึงไอคอนแอพ?
AsifHabib

10

นี่คือหมวดหมู่บน UIImage ตามโซลูชันที่ Cherpak Evgeny ให้ไว้ข้างต้น

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 ส่งภาพไปยังแคชของระบบ แต่บางครั้งการเปิดตัวอิมเมจมีขนาดใหญ่มากดังนั้นจึงอยู่ในหน่วยความจำจนกว่าแคชจะ
ล้าง

9

คำตอบของ @ codeman อัปเดตสำหรับ 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

}

ในการเรียกใช้และรองรับการหมุนสำหรับ 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)
    }

}

สิ่งที่ฉันต้องการขอบคุณ!


7

ฉันเพิ่งเขียนวิธีการทั่วไปในการรับชื่อภาพสแปลชสำหรับ iPhone และ iPad (แนวนอน, แนวตั้ง) มันใช้ได้ผลสำหรับฉันหวังว่ามันจะช่วยคุณได้เช่นกัน ฉันเขียนสิ่งนี้ด้วยความช่วยเหลือของคำตอบ SO อื่น ๆ ขอบคุณ @Pichirichi สำหรับรายการทั้งหมด

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

วิธียูทิลิตี้อื่น ๆ คือ

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

มีข้อผิดพลาดเล็กน้อยในรหัสนี้สำหรับ isDeviceiPhone4: [[UIScreen mainScreen] ขอบเขต] ตอนนี้เปลี่ยนไปตามการวางแนวที่คุณอยู่ภายใต้ iOS 8 คุณจะต้องแปลงเป็นขอบเขตแนวตั้งอย่างชัดเจนโดยทำสิ่งต่างๆเช่น: [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]แต่ให้ อย่าลืมทดสอบว่าคุณใช้ iOS 8 ก่อนไม่เช่นนั้นจะผิดพลาด
Mohamed Hafez

ขอบคุณ @Hafez ที่ชี้ให้เห็นว่าฉันจะทดสอบ iOS 8 และอัปเดตคำตอบเร็ว ๆ นี้
zaheer

7

คำตอบของ Cherpak Evgeny เวอร์ชัน Swift:

    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 ฉันอ้างอิงภาพการเปิดตัวของฉันใน InterfaceBuilder ว่า:

"LaunchImage.png"

... และด้วย Xcode 5.0.2 ระบบจะดึงภาพที่เหมาะสมออกจากแคตตาล็อกเนื้อหาโดยอัตโนมัติ

นี่คือสิ่งที่ฉันคาดหวังยกเว้นการเปลี่ยนชื่อ "Default.png" เป็น "LaunchImage.png" อย่างเงียบ ๆ ของ Apple :)


อีกสิ่งหนึ่งที่ควรสังเกต ขนาดของภาพเหล่านี้ควรตรงตามที่ Apple แนะนำ (ตัวอย่างเช่น 320x480 สำหรับ LaunchImage สำหรับ iOS 5-6 iPhone 3GS) มิฉะนั้นจะเป็นnilหลังจากกำหนดค่าเริ่มต้น
Alexander Kostiev

3

ในเอกสารมีระบุไว้อย่างชัดเจน:

"ชุดในแค็ตตาล็อกสินทรัพย์แต่ละคนมีชื่อ . คุณสามารถใช้ชื่อที่โปรแกรมโหลดภาพของแต่ละบุคคลใด ๆ ที่อยู่ในชุดที่จะโหลดภาพโทร. UIImage: ImageNamed:วิธีผ่านชื่อของชุดที่มีภาพ .”

การใช้รายการของ Pichirichi ช่วยแก้ปัญหาความไม่ลงรอยกันนี้


1
สังเกตส่วน "ชื่อชุด" เมื่อดูแคตตาล็อกเนื้อหาของฉันฉันมีชุดชื่อ "LaunchImage" ในการโหลดภาพเปิดตัวฉันเรียกว่า: ใช้UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];งานได้ดี!
ลีแอนน์

1
ไม่จำเป็นต้องใช้รายการของ Pichirichi (คิดว่ายังคงเป็นข้อมูลที่ยอดเยี่ยมที่ควรรู้) เพียงแค่ใช้ชื่อ "ชุด" ของแคตตาล็อกเนื้อหา
leanne

2
สำหรับฉันแล้วสิ่งนี้ใช้ไม่ได้กับ Launch Image บน Xcode 6.0.1 และ iOS 8 LaunchImage ดูเหมือนจะพิเศษเนื่องจากภาพจะจบลงทีละภาพในชุดแอพที่คอมไพล์และไม่อยู่ในโฟลเดอร์ xcasset bundle
auco

จะเกิดอะไรขึ้นหากมีแคตตาล็อกเนื้อหาที่แตกต่างกันสองรายการที่มีชุดที่มีชื่อเหมือนกัน จะ[UIImage imageNamed:..]รู้ได้อย่างไรว่าจะเลือกอันไหน?
Carlos P

สำหรับฉันมันใช้ไม่ได้ XCode 6.0.1 iOS 7 iPod Touch
dev

3

หนึ่งสามารถเข้าถึงภาพเปิดตัวด้วยรหัสหนึ่งบรรทัด

 UIImage *myAppsLaunchImage = [UIImage launchImage];

โปรดทำตามขั้นตอนที่ระบุด้านล่างเพื่อใช้งานฟังก์ชันที่แสดงไว้ด้านบน

ขั้นตอนที่ 1.ขยายUIImageชั้นเรียนโดยสร้างหมวดหมู่และเพิ่มวิธีการต่อไปนี้

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

ขั้นตอนที่ 2วิธีการข้างต้นควรใช้งานได้โดยการเพิ่มรหัสต่อไปนี้ในหมวดหมู่เดียวกันของ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;
}

คำตอบที่ยอดเยี่ยมขอบคุณ!
dortzur

1
ตอนนี้ชื่อภาพเปิดตัว iPhone X คืออะไร?
RPM

2

ฉันตระหนักดีว่านี่ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุดสำหรับทุกคน แต่วิธีที่ง่ายที่สุด (และเกิดข้อผิดพลาดน้อยที่สุดคือ IMHO) คือการสร้างรายการแยกต่างหากในแคตตาล็อก Images.xcassets ของคุณ SplashImageผมเรียกมันว่า

เมื่อคุณไปเพิ่มรายการใหม่อย่าเลือก "New Launch Image" เป็นตัวเลือก ให้เลือก "ชุดรูปภาพใหม่" ทั่วไปแทน จากนั้นเปิดตัวตรวจสอบและเลือกตัวเลือกที่เกี่ยวข้อง หากคุณกำลังสร้างสำหรับอุปกรณ์เรติน่าอย่างที่ฉันเป็นคุณสามารถเลือกสิ่งต่อไปนี้:

ผู้ตรวจสอบภาพ

สิ่งนี้จะทำให้คุณมีสี่รายการ (iPhone 4S, iPhone 5 (s, c), iPhone 6 และ iPhone 6 Plus)

ภาพ

ไฟล์ที่เกี่ยวข้องกับภาพมีดังนี้:

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

แน่นอนว่าหลังจากทำเสร็จแล้วคุณก็สามารถใช้งานได้ [UIImage imageNamed:@"SplashImage"]


1
ความคิดที่น่าสนใจ แต่ใช้ไม่ได้กับ iPhone 6 แต่ยังโหลดภาพ Default@2x.png บนเครื่องจำลอง iPhone 6
nonamelive

เมื่อใช้วิธีนี้คุณควรดูแลเกี่ยวกับชุดภาพเปิดตัวสำหรับแนวนอนด้วย
berec

2

ด้วยความช่วยเหลือของคำตอบของ Pichirichi ฉันได้ใช้หมวดหมู่ต่อไปนี้ (iOS 7+): UIImage + AssetLaunchImage

จริงๆแล้วมันเป็นมากกว่าการสร้างชื่อในทันที แต่อาจเป็นประโยชน์


0

อัปเดตเป็นไวยากรณ์ 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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.