转载请注明出处,保留原帖地址及作者署名.
Url:http://blog.csdn.net/ysy441088327/article/details/8852304
Author:余书懿
引言:
精华实例是博主我新开设的一个专题,这个专题主要介绍一些在iOS应用中非常值得实践的例子.
欢迎大家转载和传播,但请保留原著出处.因为我随时可能会更新以及纠错.
我希望每一个阅读精华实例的开发者能够从中受益,并且熟练的运用这些技巧.
那么作为你们呢,在阅读完这篇文章以后,请尽量留下你的建议和看法. 这是我持续改进文章的一个主要方式.
精华实例的章节到底会有多少篇,这个我也很难预料,不过只要是我认为值得写的,我都会写出来. 让大家共同学习和成长!
开篇的废话比较多,下面开始进入正文:
什么是App启动插画的自定义过度?
我们都知道,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来自定义更多隐藏插画的方式.
希望有人能够pull request 很棒的自定义隐藏代码!
小技巧:
1.如何全屏展示启动插画(隐藏状态栏那种)?
勾上即可!
2.如何在展示完成以后又立刻恢复状态栏的显示?
总结:
博主本人已对此功能进行封装,基本上不需要关心核心功能的实现,那为什么还要费一大半劲去阐述原理?
因为该功能在于如何利用UIWindow去实现,或者说我们想把顶部状态栏更好的掌控在手中,那么理解UIWindow是首当其冲!
阅读完本文以后有任何疑问,都务必说出来,不想注册csdn账号的,可以通过微博私信我,这是我持续改进文章内容的主要方式. 谢谢!