通过LaunchScreen自定义启动动画

转自 Andy矢倉  http://www.jianshu.com/p/2f1149269cd0

 
 

大致内容是:通过获取打包到App里的启动图,初始化一个UIImageView与屏幕同等大小再加载到UIWindow上来做启动延时,从而达到自定义启动动画的目的。代码里的各种Key没太看懂,放到工程里也没法显示效果。文中的意思是不要增加启动图的方式来适配,那我想了想iOS启动画面的方式目前我所知就两种:启动图和布局文件。我现在基本上没有用图片作为启动图,都是直接用布局文件搞定。

PS:今年开发的App基本上都是支持iOS7以上了,所以没太用启动图了,Xcode 6LaunchScreen.xib,到Xcode 7变成了LaunchScreen.storyboard,无可厚非,两者本质都是一样的。

教程看的云里雾里的,不过不打紧,思路还是一样的,我想如果StoryboardSize Class玩得多同学还是喜欢布局文件作为启动图的方式吧,所以我的方式是获取LaunchScreen.storyboard里的ViewController,在把View提取出来加到UIWindow显示做动画即可。

这种方式的好处就是,获取大小就是屏幕的大小,而且只要你把不同屏幕的布局搞定了,系统会帮你生成好加在的启动页,这样就免去了判断和从新设置大小的麻烦,这样才是真适配嘛~

废话不多说,上代码吧~ (对了,记得给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];
}];

此代码片段,如果应用启动初始化如果是代码可以在AppDelegate加,Storyboard加载方式需要加在ViewController里。


2015.11.27
最近项目UI框架切换到UITabBarController,发现这个动画没法使用,是由于如果在Storyboard中使用UITabBarController,如果做启动登录需求,肯定是按需加载,就需要自建继承自UITabBarController的关联,如果在- (void)viewDidLoad里加载就会导致如下警告:

Warning: Attempt to present <HXLoginViewController: 0x7fa5a063cca0> on <HXMainViewController: 0x7fa5a05ae0b0> whose view is not in the window hierarchy!**

系统没法知道该怎么显示,所以只能放到- (void)viewDidAppear:(BOOL)animated里来做,UITabBarController框架加载这个动画没效果也是这个原因,但是没Debug警告,不过要注意,如果只是单纯使用这个动画没啥问题,但是如果在UITabBarController上用模态视图的方式做按需加载以及转场动画需要处理- (void)viewDidAppear:(BOOL)animated重复调用的问题。


2016.03.28
最近看到很多人留言没效果,其实稍微调试一下就知道,不是没效果,是时机出了问题,之前的效果应该在9.1之前能看到,新的系统版本应该改了时机,这里的技巧无非就是在以下三个时机处理:

- (void)viewDidLoad;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;

经过了测试在viewDidLoadviewWillAppear:加这个效果都是出现视图层级的问题,这是由于控制器生成的视图直接盖在了启动页上,层级在其之上当然无法显示。

按照之前的方式在viewDidLoad或者viewWillAppear实际的效果是这样:

所以现在想要看到效果,就只能在最后一个时机viewDidAppear:里加入示例代码了。

Demo:https://github.com/shicang1990/LaunchScreenAnimation-Storyboard



作者:Andy矢倉
链接:http://www.jianshu.com/p/2f1149269cd0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

LunchScreen.storyboard需要设置storyboardID, 我的是dd(WithName就是dd)而Identifier就是LaunchScreen(用到的launchScreen.storyboard)

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
    [self launchAnimation];
}

#pragma mark - Private Methods
- (void)launchAnimation {
    UIViewController *viewController = [[UIStoryboard storyboardWithName:@"dd" bundle:nil]
    instantiateViewControllerWithIdentifier:@"LaunchScreen"];
    
    UIView *launchView = viewController.view;
    UIWindow *mainWindow = [UIApplication sharedApplication].keyWindow;
    launchView.frame = [UIApplication sharedApplication].keyWindow.frame;
    [mainWindow addSubview:launchView];
    
    [UIView animateWithDuration:1.0f delay:0.5f options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        launchView.alpha = 0.0f;
        launchView.layer.transform = CATransform3DScale(CATransform3DIdentity, 2.0f, 2.0f, 1.0f);
    } completion:^(BOOL finished) {
        [launchView removeFromSuperview];
    }];
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值