通过获取打包到App里的启动图,初始化一个UIImageView与屏幕同等大小再加载到UIWindow上来做启动延时,从而达到自定义启动动画的目的。iOS启动画面的方式目前我所知就两种:启动图和布局文件。
启动图(LaunchImage)###
启动图(LaunchImage)的管理其实在iOS开始中算比较简单的了 尤其是Xcode引入了xcassets之后,完全是傻瓜式的操作,有的时候我们还是需要获取Launch Image。
LaunchImage在APP初始化完之后会立即消失并显示APP的界面 ,但是有的时候我们不希望它这么快就消失(比如有的人希望有个过渡效果 有的人希望等某些设置或者数据加载完之后再消失) 这也很简单,我们只要自己把LaunchImage再显示出来并且置顶就OK了。
不过我们配置了那么多适用于不同屏幕分辨率的LaunchImage 如何获取适合于当前屏幕分辨率的LaunchImage呢?
普通的办法是 把所有LaunchImage加入到工程并根据屏幕分辨率来命名 比如(640_960.png 640_1136.png …) 然后在程序中用代码拼接出对应的文件名 并引用
但是这种办法比较原始 而且万一以后苹果又出了一些其他分辨率的设备 或者启动图发生变化的时候 又需要人工的修改工程配置 不太好 而且还需要多占一份资源(APP的容量又变大啦)
解决办法读取NSBundle中的设置 即可获取当前适用的LaunchImage
CGSize viewSize = self.window.bounds.size;
NSString *viewOrientation = @"Portrait"; //横屏请设置成 @"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"];
}
}
UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:launchImage]];
launchView.frame = self.window.bounds;launchView.contentMode = UIViewContentModeScaleAspectFill;
[self.window addSubview:launchView];
[UIView animateWithDuration:2.0f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState animations:^{
launchView.alpha = 0.0f;
launchView.layer.transform = CATransform3DScale(CATransform3DIdentity, 1.2, 1.2, 1);
} completion:^(BOOL finished) {
[launchView removeFromSuperview];
}];
布局文件(LaunchScreen)###
开发的App基本上都是支持iOS7以上了,所以没太用启动图了,Xcode 6是LaunchScreen.xib,到Xcode 7变成了LaunchScreen.storyboard,无可厚非,两者本质都是一样的。
如果Storyboard和Size Class玩得多同学还是喜欢布局文件作为启动图的方式吧,所以我的方式是获取LaunchScreen.storyboard里的ViewController,在把View提取出来加到UIWindow显示做动画即可。
这种方式的好处就是,获取大小就是屏幕的大小,而且只要你把不同屏幕的布局搞定了,系统会帮你生成好加在的启动页,这样就免去了判断和从新设置大小的麻烦,这样才是真适配嘛~
PS:记得给LaunchScreen.storyboard里的ViewController设置好Storyboard ID
UIViewController *viewController = [[UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil] instantiateViewControllerWithIdentifier:@"LaunchScreen"];
UIView *launchView = viewController.view;
UIWindow *mainWindow = [UIApplication sharedApplication].keyWindow;
launchView.frame = [UIApplication sharedApplication].keyWindow.frame;
[mainWindow addSubview:launchView];
[UIView animateWithDuration:0.6f delay:0.5f options:UIViewAnimationOptionBeginFromCurrentState animations:^{
launchView.alpha = 0.0f;
launchView.layer.transform = CATransform3DScale(CATransform3DIdentity, 1.5f, 1.5f, 1.0f);
} completion:^(BOOL finished) {
[launchView removeFromSuperview];
}];