最新在写一个APP启动页广告,我的思路是在启动页显示完毕之后马上以同样的图片盖上去,同时请求服务器上的广告图片,当图片缓存下来之后就替换掉图片。据我分析网易新闻等APP就是这样实现的吧!
Images.xcassets是Xcode5之后才开始出现的,当我想从Images.xcassets获取启动图片的时候,图片没有获取到。我在写demo的时候从以前工程中拖动了两个启动页测试,一切正常。当我放在正式工程中去的时候发现图片获取不到了。最后我发现原来是图片命名的问题,我以前老工程图片是LaunchImage-700-568h形式的命名,直接就能取到图片,但是新工程不是这种命名方式了。因此我们可以通过使用以下的名称获取到对应图片。程序的appicon直接获取也是获取不到的。
LaunchImage的名字组成形式是这样的:
[LaunchImage在Assets Catalog中的注册名字]-[iOS版本]-[屏幕方向]-[屏幕高度][比例].png
如下:
iOS | Display | Image Name |
---|---|---|
iOS5,6 | 3.5inch | LaunchImage |
iOS5,6 | 3.5inch Retina | LaunchImage@2x |
iOS5,6 | 4.0inch Retina | LaunchImage-568h@2x |
iOS7,8 | 3.5inch Retina | LaunchImage-700@2x |
iOS7,8 | 4.0inch Retina | LaunchImage-700-568h@2x |
iOS8 | 4.7inch Retina | LaunchImage-800-667h@2x |
iOS8 | 5.5inch Retina Portrait | LaunchImage-800-Portrait-736h@3x |
iOS8 | 5.5inch Retina Landscape | LaunchImage-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
<br/>