《A GUIDE TO IOS ANIMATION 2.0》(杨骑滔)三章.CoreAnimation-学习笔记: 源码分析和盲点记录

21- 《A GUIDE TO IOS ANIMATION 2.0》(杨骑滔)三章.CoreAnimation-学习笔记: 源码分析和盲点记录

第一个案例: Twitter 的启动动画

这个案例之前有看过.当时觉得很有意思. 今天看了杨骑滔给出的实现思路之后,才发现实现代码不难,难的还是你的实现的思路. 我们仔细观察,书中的启动动画,开始的页面是从程序启动之后一直到进入根控制器都是同一个,而且明显,要比我们平时的启动界面停留的时间要长.这个的实现思路和我们看到的很多主流APP进入之后,会有一个广告界面,还有倒计时.这个肯定是系统自带的LaunchScreen.xib启动完成之后,在显示根控制器之前穿插的. 只不过,广告和启动是不同的页面,我们这里是需要两个样式一模一样的页面.

原理,我就不赘述了.我想看了书的人和看了源码的人早已经了然于胸. 现在只是记录下自己的知识的盲点.

UIWindow的两个方法

[self.window makeKeyAndVisible];self.window.rootViewController的具体作用:

-------- 占位行 ------------

mask属性

“在开始之前,我们先了解一下 Layer 的 mask 属性。
@property(strong) CALayer *mask;
可以发现 mask 也是一个 CALayer”
--- 摘录来自: 杨骑滔(KittenYang). “A GUIDE TO IOS ANIMATION”。 iBooks.

 //logo mask 添加一个遮罩,图片透明和不透明的地方反转
CALayer *maskLayer = [CALayer layer];
maskLayer.contents = (id)[UIImage imageNamed:@"1"].CGImage; //必须是CGImageRef
maskLayer.position = navc.view.center;
maskLayer.bounds = CGRectMake(0, 0, 60, 60);
navc.view.layer.mask = maskLayer; //为mask(CALayer)属性赋值之后,露出window是黑色的,必须通过改变self.window.background的颜色

CoreAnimation - CAKeyframeAnimation

---- 以下均为原文,摘录来自: 杨骑滔(KittenYang). “A GUIDE TO IOS ANIMATION”。 iBooks.

  1. 顾名思义,CAKeyframeAnimation 就相当于 Flash 里的关键帧动画”
  1. CAKeyframeAnimation 中我们通过 keyPath 就可以指定动画的类型。”
  2. 然后,我们把每个关键帧的对应参数赋值给 CAKeyframeAnimation 的 values 属性。代码中,我设置了3个关键帧,transformAnimation.values = xxx
  3. 设置对应的时间点 transformAnimation.keyTimes = xxx
  4. 但是我们还要注意。当你给一个 CALayer 添加动画的时候,动画其实并没有改变这个 layer 的实际属性。取而代之的,系统会创建一个原始 layer 的拷贝。在文档中,苹果称这个原始 layer 为 Model Layer ,而这个复制的 layer 则被称为 Presentation Layer 。 Presentation Layer 的属性会随着动画的进度实时改变,而 Model Layer 中对应的属性则并不会改变。所以如果你想要获取动画中每个时刻的状态,请使用 layer 的 func presentationLayer() -> AnyObject!
  5. 为了让动画在结束之后不突然回到了初始状态, 引出 removedOnCompletion 和 fillMode 了。
    removedOnCompletion 的官方解释是:
    /* When true, the animation is removed from the render tree once its
    • active duration has passed. Defaults to YES. */

也就是默认情况下系统会在 duration 时间后自动移除这个 CAKeyframeAnimation。当 remove 了某个动画,那么系统就会自动销毁这个 layer 的 Presentation Layer ,只留下 Model Layer ”

  1. 你需要先把 removedOnCompletion 设置为 false ,然后设置 fillMode 为kCAFillModeForwards” (TIPS: 对于 CAAnimation ,你需要将其 removedOnCompletion 设置为 false 才行,要不然 fillMode 将不起作用。”)。但设置 removedOnCompletion 和 fillMode 不是正确的方式(这个之后再详细说明)。
  2. 所以一个好动画离不开一堆好参数。

第二个案例: 圆圈遮罩的转场动画

这个案例讲的是转场动画,这个Demo的效果可以看格瓦拉选中一个条目之后,

关于转场动画

“iOS7 开始苹果推出了自定义转场的 API 。从此,任何可以用 CoreAnimation 实现的动画,都可以出现在两个 ViewController 的切换之间。”

“苹果在 UINavigationControllerDelegateUIViewControllerTransitioningDelegate 中给出了几个协议方法,通过返回类型就可以很清楚地知道各自的具体作用。你只需要重载它们,然后 return 一个动画的实例对象,一切都搞定了。使用准则就是:UINavigationController pushViewController 时重载 UINavigationControllerDelegate 的方法;UIViewController presentViewController 时重载 UIViewControllerTransitioningDelegate 的方法。”

——摘录来自: 杨骑滔(KittenYang). “A GUIDE TO IOS ANIMATION”。 iBooks.

实现步骤

1.根据第一小节中提到的关于转场动画的解释,是说我们在当天起始跳转控制器中实现对应的 push 或者 present对应的代理方法.
2.创建继承自 NSObject 并且声明 UIViewControllerAnimatedTransitioning 的的动画类
3.重载 UIViewControllerAnimatedTransitioning 中的协议方法。

就这三步. 具体的转场效果,在第3步中自行定义,你写成啥样的,他就按照给你样转

案例分析

再回到我们这个案例.这个效果,其实是两个有形状的UIBezierPath的贝塞尔曲线对象的path值,分别作为CABasicAnimation对象的起始值到终点值. 然后系统内部发生的变化. 参看下边代码:

maskLayerAnimation.fromValue = (__bridge id)(maskStartBP.CGPath);
maskLayerAnimation.toValue = (__bridge id)((maskFinalBP.CGPath));

杨骑滔在animateTransition:方法中,首先获取到跳转和跳转到的控制器,然后把这两个控制器的view添加到transitionContext.containerView中,接着创建两个圆形的UIBezierPath对象,最终的转成效果类似我们案例一.实现代码也有类似的地方.

其中,第一个需要注意的地方是:触发点的判断,判断在哪个象限,然后得出出发点的坐标,如果你对象限有点遗忘的话,你可以看下边这幅图,马上就想起来了:


http://blog.csdn.net/ys410900345/article/details/42924827

/** timingFunction 
 * 
 *  用于变化起点和终点之间的插值计算,形象点说它决定了动画运行的节奏,比如是均匀变化(相同时间变化量相同)还是 
 *  先快后慢,先慢后快还是先慢再快再慢. 
 * 
 *  动画的开始与结束的快慢,有五个预置分别为(下同): 
 *  kCAMediaTimingFunctionLinear            线性,即匀速 
 *  kCAMediaTimingFunctionEaseIn            先慢后快 
 *  kCAMediaTimingFunctionEaseOut           先快后慢 
 *  kCAMediaTimingFunctionEaseInEaseOut     先慢后快再慢 
 *  kCAMediaTimingFunctionDefault           实际效果是动画中间比较快. 
 */  

《IOS 30多个iOS常用动画,带详细注释》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容