Xcode 5 & Danh mục nội dung: Làm thế nào để tham khảo LaunchImage?


102

Tôi đang sử dụng Danh mục nội dung của Xcode 5 và tôi muốn sử dụng của tôi LaunchImagelàm hình nền của chế độ xem nhà của tôi (một phương pháp khá phổ biến để làm cho quá trình chuyển đổi từ 'đang tải' sang 'được tải' trông mượt mà).

Tôi muốn sử dụng cùng một mục nhập trong Danh mục nội dung để tiết kiệm dung lượng và không phải sao chép hình ảnh trong hai Bộ hình ảnh khác nhau.

Tuy nhiên, gọi:

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

Câu trả lời:


83

Đây là danh sách (gần như) đầy đủ của LaunchImage (ngoại trừ các hình ảnh iPad không có thanh trạng thái):

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

Có ai biết hình ảnh iPad không có thanh trạng thái không?
Mohamed Hafez

1
@Mohamed Hafez: Pichirichi thực sự đã đưa chúng vào danh sách của mình. Chúng là LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png và LaunchImage-Landscape@2x~ipad.png.
John Jacecko

Con số 700 và 800 có ý nghĩa gì?
Sound Blaster

2
Tôi đã bắt được nó: có nghĩa là iOS 7 & 8
Sound Blaster

4
Đó là cực kỳ khó chịu mà XCode sẽ tự động tạo một tên tập tin cho các phần tử hình ảnh và làm cho bạn nhảy qua hoops để tìm ra cách để truy cập trực tiếp họ ...
Ông 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
Hoạt động tuyệt vời. Cách tiếp cận thông minh và thanh lịch để tìm kiếm từ điển thông tin của gói chính để tìm hình ảnh khởi chạy có sẵn và sau đó chọn hình ảnh có độ phân giải phù hợp!
iOSX

1
Đây là một ý tưởng tuyệt vời, tốt hơn của tôi và cũng là bằng chứng trong tương lai, trừ khi Apple thay đổi cấu trúc của info.plist.
nonamelive

1
Đây là một giải pháp rất thông minh. Tôi có nhiều mục tiêu trong các dự án Xcode của mình và chỉ sử dụng chuỗi LaunchImage không phải lúc nào cũng trả lại hình ảnh chính xác. Cảm ơn rất nhiều.
Enrico Susatyo

3
Ý tưởng tuyệt vời mặc dù. Nhưng không hoạt động đối với màn hình có thanh trạng thái mờ. Vì vậy, cần phải thay đổi self.view.bounds.size thành [UIScreen mainScreen] .bounds.size
RamaKrishna Chunduri

1
Giải pháp tuyệt vời. Cần chỉnh sửa nhỏ: Có một chuyển đổi ngầm từ UIInterfaceOrientation sang UIDeviceOrientation. Sử dụng UIInterfaceOrientationIsLandscape()thay thế.
Almog C

53

LaunchImages là đặc biệt và không thực sự là một danh mục nội dung trên thiết bị. Nếu bạn sử dụng iFunBox / iExplorer / etc (hoặc trên trình mô phỏng, hoặc trong thư mục xây dựng), bạn có thể thấy tên cuối cùng và sau đó viết mã để sử dụng chúng - ví dụ: đối với dự án chỉ dành cho iPhone iOS7, điều này sẽ thiết lập hình ảnh khởi chạy phù hợp:

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

Tôi đặt nó vào viewDidLoad.

Điều này không thực sự lý tưởng, sẽ thật tuyệt nếu Apple cung cấp cho chúng tôi một API tốt để làm điều này.


2
Điều này phù hợp với tôi, nhưng tôi thực sự ước có một cách đơn giản hơn để tham khảo hình ảnh khởi chạy.
Zorayr

Có lẽ cố định trong Xcode 5.0.2 - xem dưới đây, dường như công việc đối với tôi đơn giản chỉ để tham khảo "LaunchImage.png"
Adam

1
@Adam Rất thích nếu điều đó là sự thật! Tôi vừa thử trên iphone5s / xcode5.0.2 / ios7.0.4, [UIImage imageNamed: @ "LaunchImage.png"] cho tôi là không.
JosephH

@JosephH hừm. Có thể nó yêu cầu một dự án mới được tạo? Đây là một dự án được tạo trong Xcode 5.0.2, chỉ có thay đổi về mặc định là "đã tắt ARC". Nó hoạt động tuyệt vời :). Tôi sẽ xem liệu tôi có thể tìm thấy bất cứ điều gì khác, nhưng không thể nghĩ rằng tôi có thể đã thay đổi điều gì khác
Adam

Tôi đang thử mã tương tự nhưng sử dụng "Mặc định" và "Mặc định-568h" (tên tệp tài nguyên gốc). Sau khi xem xét bên trong gói ứng dụng đã xuất, tôi nhận ra rằng Xcode đổi tên thành "LaunchImage-700 *".
Nicolas Miari

27

Ứng dụng của tôi hiện chỉ hỗ trợ iOS 7 trở lên.

Đây là cách tôi tham chiếu hình ảnh khởi chạy từ danh mục nội dung:

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

Bạn có thể thêm nhiều cặp giá trị khóa hơn nếu muốn hỗ trợ các phiên bản iOS cũ hơn.


1
Lưu ý rằng bắt đầu với iOS 8, UIScreen.mainScreen.boundssẽ khác nhau tùy thuộc vào hướng giao diện hiện tại. Xem stackoverflow.com/a/24153540/158525
Jean Regisser

1
Cảm ơn vì điều này, chính xác những gì tôi đang tìm kiếm!
Joseph Paterson

Cảm ơn htis, bất kỳ phương pháp nào để truy cập Biểu tượng ứng dụng?
AsifHabib

10

Đây là một danh mục trên UIImage dựa trên giải pháp được cung cấp bởi Cherpak Evgeny ở trên.

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 push ảnh để bộ nhớ cache hệ thống, nhưng ra mắt hình ảnh đôi khi là rất lớn, vì vậy nó là trong bộ nhớ cho đến khi bộ nhớ cache thổi sạch chúng
Igor Palaguta

9

Câu trả lời của @ codeman đã được cập nhật cho 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

}

Để gọi nó và hỗ trợ xoay cho 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)
    }

}

Chỉ những gì tôi cần, cảm ơn!


7

Tôi vừa viết một phương pháp chung để lấy tên hình ảnh giật gân cho iPhone và iPad (Phong cảnh, Chân dung), Nó phù hợp với tôi, hy vọng Nó cũng giúp được bạn. Tôi đã viết bài này với sự trợ giúp của các câu trả lời SO khác, cảm ơn @Pichirichi cho toàn bộ danh sách.

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

Các phương pháp tiện ích khác là

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

Thực sự có một lỗi nhỏ trong mã này cho isDeviceiPhone4: [[UIScreen mainScreen] giới hạn] hiện thay đổi dựa trên hướng bạn đang ở trong iOS 8. Bạn sẽ cần phải chuyển đổi rõ ràng nó thành giới hạn dọc bằng cách làm như:, [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace]nhưng thực hiện Hãy chắc chắn kiểm tra xem bạn có đang sử dụng iOS 8 hay không trước nếu không sẽ bị lỗi.
Mohamed Hafez

Cảm ơn @Hafez đã chỉ ra điều đó, tôi sẽ thử nghiệm nó cho iOS 8 và cập nhật câu trả lời sớm.
zaheer

7

Phiên bản Swift của câu trả lời của 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

Theo câu trả lời của @ Pichirich, tôi đã tham chiếu launchimage của mình trong InterfaceBuilder là:

"LaunchImage.png"

... và với Xcode 5.0.2, nó sẽ tự động loại bỏ hình ảnh thích hợp thẳng ra khỏi Danh mục nội dung.

Đây là những gì tôi mong đợi - ngoại trừ động thái xấu xa ác độc của Apple là âm thầm đổi tên "Default.png" thành "LaunchImage.png" :)


Một điều nữa cần được lưu ý. Kích thước Những hình ảnh nên được chính xác như Apple khuyến cáo (320x480 cho LaunchImage dành cho iOS 5-6 iPhone 3GS chẳng hạn), nếu không nó sẽ được nilsau khi được khởi động
Alexander Kostiev

3

Trong tài liệu có ghi rõ:

"Mỗi tập hợp trong danh mục nội dung có một tên . Bạn có thể sử dụng tên đó để tải theo chương trình bất kỳ hình ảnh riêng lẻ nào có trong tập hợp đó. Để tải hình ảnh, hãy gọi phương thức UIImage: ImageNamed:, chuyển tên của tập hợp chứa hình ảnh . "

Sử dụng danh sách của Pichirichi giúp giải quyết sự mâu thuẫn này.


1
Lưu ý phần "tên của tập hợp". Nhìn vào danh mục nội dung của tôi, tôi có một bộ có tên "LaunchImage". Sau đó, để tải hình ảnh khởi chạy, tôi gọi: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];Hoạt động tuyệt vời!
leanne

1
Không cần sử dụng danh sách của Pichirichi (nghĩ rằng đó vẫn là thông tin tuyệt vời cần biết) - chỉ cần sử dụng tên của "bộ" danh mục nội dung.
leanne

2
Vâng, đối với tôi, điều này không hoạt động đối với Hình ảnh Khởi chạy trên Xcode 6.0.1 và iOS 8. LaunchImage có vẻ đặc biệt vì các hình ảnh kết thúc riêng lẻ trong gói ứng dụng đã biên dịch và không nằm trong thư mục gói xcasset.
auco

Điều gì xảy ra nếu có hai danh mục nội dung khác nhau chứa các tập hợp được đặt tên giống nhau? Làm thế nào để [UIImage imageNamed:..]biết cái nào để chọn?
Carlos P

Đối với tôi đây không phải làm việc, XCode 6.0.1 iOS 7 iPod Touch
dev

3

Người ta có thể dễ dàng truy cập hình ảnh Launch bằng một dòng mã.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

Vui lòng làm theo các bước dưới đây để đạt được chức năng được mô tả ở trên.

Bước 1. Mở rộngUIImagelớp bằng cách tạo một danh mục và thêm phương thức sau vào nó.

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

Bước 2. Phương pháp trên sẽ hoạt động bằng cách thêm mã sau vào cùng một danh mụcUIImage

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

Câu trả lời xuất sắc, Cảm ơn!
dortzur

1
Tên cho hình ảnh ra mắt iPhone X bây giờ là gì?
RPM

2

Tôi nhận thấy rằng đây không nhất thiết phải là giải pháp tốt nhất cho tất cả mọi người nhưng cách dễ nhất (và ít lỗi nhất, IMHO) để làm điều này là tạo một mục riêng trong danh mục Images.xcassets của bạn. Tôi đã gọi nó SplashImage.

Khi bạn thêm một mục mới, hãy đảm bảo không chọn "Hình ảnh Khởi chạy Mới" làm tùy chọn. Thay vào đó, hãy chọn "Bộ Hình ảnh Mới" chung chung. Tiếp theo, mở trình kiểm tra và chọn các tùy chọn liên quan. Nếu bạn đang xây dựng chỉ cho các thiết bị retina, như tôi đã từng làm, bạn có thể chọn những điều sau:

người kiểm tra hình ảnh

Điều này sẽ để lại cho bạn bốn mục nhập (iPhone 4S, iPhone 5 (s, c), iPhone 6 và iPhone 6 Plus).

hình ảnh

Các tệp tương ứng với các hình ảnh như sau:

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

Tất nhiên, sau khi hoàn thành việc này, bạn chỉ cần sử dụng [UIImage imageNamed:@"SplashImage"]


1
Ý tưởng thú vị, nhưng nó không hoạt động trên iPhone 6. Nó vẫn tải hình ảnh Default@2x.png trên trình mô phỏng iPhone 6.
nonamelive

Sử dụng cách tiếp cận này, bạn cũng nên quan tâm đến tập hợp các hình ảnh phóng cho hướng ngang.
berec

2

Với sự trợ giúp về câu trả lời của Pichirichi, tôi đã triển khai danh mục sau (iOS 7+): UIImage + AssetLaunchImage

Nó thực sự ít hơn việc tạo tên một cách nhanh chóng, nhưng có lẽ sẽ hữu ích.


0

Cập nhật cú pháp Swift mới nhất (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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.