我们都知道,App在启动的时候,会展示一张App启动插画来保证App程序加载的等待体验,让用户欣赏美丽的插画时,App真正默默的努力加载着相关资源,
App自动调用main函数,接着是:didFinishLaunchingWithOptions
当UIWindow执行makeKeyAndVisible时,那么这张启动插图就会自动消失了.但却是瞬间消失的.
而所谓的自定义过度就是让启动插图更加友好的消失(而不是瞬间没了),相信在很多主流App产品中已经看到不少这样的效果.
那么这个实现方式就是本文要讨论的重点!
程序原理是?
程序有时也会有点魔术的感觉,在你不知道原理的时候总感觉它很神秘!
App启动插画我们通过工程设置-targets-Summary-Launch Images 来设定.
但是这个启动插画的指针我们是获取不到的.(要是获取到了,这篇文章估计很短,甚至没有.)
那怎么办呢? 我们肯定要有这个指针,才能去实现自定义的过度,例如一点一点的消失啊,翻一页书那样的效果等等.
出于我们的目的,我们只有自己alloc一个UIImageView了,其加载的图片就是我们启动插画的图片.
但是要保证一点:启动插画展示的是什么样子,我们自己alloc 的UIImageView也应该是什么样子, 不然,这个体验就大打折扣了 你说呢?
而这个UIImageView我们到底应该addSubview在哪里是本实例的一个技术难点.
那答案是什么?
是UIWindow!却不是keyWindow.而是一个需要我们自己alloc的UIWindow! 但是它的windowLevel要比keyWindow高一级!
也就是说,为了让UIImageView顺利的展示出来并保证与启动插画的样子一摸一样,我们需要有一个UIWindow的容器.代码如下:
UIWindow是一个很神奇的类,当你alloc出来并把windowLevel设置比keyWindow的level高以后,此时不再需要额外的执行makeKeyAndVisible或者addSubview来让这个UIWindow显示出来. 但是这个UIWindow的hidden属性却默认是YES, 所以我们需要将hidden设置为NO! 让UIWindow真正显示出来.
那么接下来把我们的UIImageView调用addSubview到这个UIWindow上面.
而alloc UIImageView时 有一点我们需要注意一下:
不要通过imageNamed的方式去获得UIImage, 大家都应该知道imageNamed是会自动把加载过的图片资源缓存起来,如果下次再调用同名称的图片,是直接从内存中获得,而我们的这个UIImageView只使用一次,当插画隐藏以后不再需要重复使用.
那正确的获取方式是什么?
以绝对路径的方式获得这张图片资源,就像下面这样:
imageWithContentsOfFile是符合我们现在使用图片资源的需求,因为它在使用完成以后会自动清理掉(ARC)
到此,我们的伪装版启动插图已经部署完成.
何时调用呢?
在第一个启动的ViewController中的viewWillAppear执行这些代码.那么不出意外的话,启动插画永远的显示了出来.
但是我们不是要一直显示啊,差不多它就应该消失了,只是说消失的时候更加友好一些!
因为我们已经有了UIImageView的指针了,接下来我们可以随意控制这个UIImageView消失的方式.
也就达到了本文的目的:
App启动插画的自定义过度
而博主我对于这项实例功能封装了一个类来方便调用! 已经上传到Github上. 欢迎大家使用并反馈问题.
它的名字叫:SYAppStart
SYAppStart的API很简单,
提供一套默认的显示和隐藏方法
核心在于hideWithCustomBlock来自定义更多隐藏插画的方式.
小技巧:
1.如何全屏展示启动插画(隐藏状态栏那种)?
勾上即可!
2.如何在展示完成以后又立刻恢复状态栏的显示?