前言:

最新在写一个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