如何从Images.xcassets中获取LaunchImage的图片

最后编辑时间: 2018-05-19

前言:

最新在写一个APP启动页广告,我的思路是在启动页显示完毕之后马上以同样的图片盖上去,同时请求服务器上的广告图片,当图片缓存下来之后就替换掉图片。据我分析网易新闻等APP就是这样实现的吧!

Images.xcassets是Xcode5之后才开始出现的,当我想从Images.xcassets获取启动图片的时候,图片没有获取到。我在写demo的时候从以前工程中拖动了两个启动页测试,一切正常。当我放在正式工程中去的时候发现图片获取不到了。最后我发现原来是图片命名的问题,我以前老工程图片是LaunchImage-700-568h形式的命名,直接就能取到图片,但是新工程不是这种命名方式了。因此我们可以通过使用以下的名称获取到对应图片。程序的appicon直接获取也是获取不到的。

说明:

LaunchImage的名字组成形式是这样的:
[LaunchImage在Assets Catalog中的注册名字]-[iOS版本]-[屏幕方向]-[屏幕高度][比例].png
如下:

iOSDisplayImage Name
iOS5,63.5inchLaunchImage
iOS5,63.5inch RetinaLaunchImage@2x
iOS5,64.0inch RetinaLaunchImage-568h@2x
iOS7,83.5inch RetinaLaunchImage-700@2x
iOS7,84.0inch RetinaLaunchImage-700-568h@2x
iOS84.7inch RetinaLaunchImage-800-667h@2x
iOS85.5inch Retina PortraitLaunchImage-800-Portrait-736h@3x
iOS85.5inch Retina LandscapeLaunchImage-800-Landscape-736h@3x

代码示例:

+ (UIImage *)getTheLaunchImage{
    NSString *defaultImageName = @"LaunchImage";
    NSInteger osVersion = floor([[[UIDevice currentDevice] systemVersion] floatValue])*100;

    NSInteger screenHeight = CGRectGetHeight([UIScreen mainScreen].bounds);
    // 3.5inch
    if (screenHeight < 568) {

        if (osVersion >= 700) {
            defaultImageName = [NSString stringWithFormat:@"%@-700",defaultImageName];
        } else {
            defaultImageName = [NSString stringWithFormat:@"%@",defaultImageName];
        }

    }
    // 4.0inch
    else if(screenHeight < 667){

        if (osVersion >= 700) {
            defaultImageName = [NSString stringWithFormat:@"%@-700-568h",defaultImageName];
        } else {
            defaultImageName = [NSString stringWithFormat:@"%@-568h",defaultImageName];
        }
    }
    // 4,7inch
    else if (screenHeight < 736) {

        defaultImageName = [NSString stringWithFormat:@"%@-800-667h",defaultImageName];

    }
    // 5.5inch
    else{
        NSString orientation = @"";
        switch ([[UIApplication sharedApplication] statusBarOrientation]) {
            case UIInterfaceOrientationUnknown:
            case UIInterfaceOrientationPortrait:
            case UIInterfaceOrientationPortraitUpsideDown:
                orientation = @"Portrait";
                break;
            case UIInterfaceOrientationLandscapeLeft:
            case UIInterfaceOrientationLandscapeRight:
                orientation = @"Landscape";
                break;
            default:
                break;
        }
        defaultImageName = [NSString stringWithFormat:@"%@-800-%@-736h",defaultImageName,orientation];
    }
    return [UIImage imageNamed:defaultImageName];}

—————-华丽的分割线 2015年12月2日更新—————-

在iOS9之后,在iOS9中的图片依然是以800为标准的,因此以上代码已经更新。
另外注意,如果项目没有开启高分模式,那么图片只能以最大以700为标准(因为现在很少有不使用高分模式的APP,因此代码中我没有进行编写),也就是如下:

    {
        UILaunchImageMinimumOSVersion = "7.0";
        UILaunchImageName = "LaunchImage-700";
        UILaunchImageOrientation = Portrait;
        UILaunchImageSize = "{320, 480}";
    },
        {
        UILaunchImageMinimumOSVersion = "7.0";
        UILaunchImageName = "LaunchImage-700-568h";
        UILaunchImageOrientation = Portrait;
        UILaunchImageSize = "{320, 568}";
    }

如果大家想通过代码查看图片标准可以使用以下代码:

    NSInteger osVersion = floor([[[UIDevice currentDevice] systemVersion] floatValue])100;
    NSString key;
    if (osVersion >= 700) {
        key = @"UILaunchImages";
    } else {
        key = @"UILaunchImageFile";
    }
    NSArray 
array = [[[NSBundle mainBundle] infoDictionary] valueForKey:key];
    NSLog(@"%@",array);

—————-华丽的分割线 2016年8月19日更新—————-

看了“神话先生”的的评论,感觉到自己写的这个太low了。推荐使用神话先生的做法,这样就去除了版本号的判断,更加方便。

 + (UIImage *)getTheLaunchImage{
    CGSize viewSize = [UIScreen mainScreen].bounds.size;

    NSString *viewOrientation = nil;
    if (([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown) || ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait)) {
        viewOrientation = @"Portrait";
    } else {
        viewOrientation = @"Landscape";
    }

    NSString *launchImage = nil;

    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"]])
        {
            launchImage = dict[@"UILaunchImageName"];
        }
    }

    return [UIImage imageNamed:launchImage];}

Demo传送门->https://github.com/ianisme/GetLaunchImage