<pre>在文章开始之前,我想谈点东西。关于付出和产出的问题。不知不觉,从事软件开发工作已经快两年了。项目没做多少,但是一只维护一个app。从其中学到了不少。</br>慢慢的发现,虽然技术学了不少,但是下一次用到同样的东西感觉和第一次使用没多大进步,还是去查文档,慢慢找。脑子里没有对这方面知识的体系,产出很少,...,</br>为了解决这种尴尬的情况,打算在每次版本更新之后,或者学习了新东西之后,把它记录下来,等到心里有了总体的轮廓,在总结一下,哈哈,想法总是好的。好了废话不多说了,进入正题吧</pre>
动画的触发方法
-
属性动画
通过改变某一个属性,例如position.x
水平移动、rotation.y
垂直方向上的旋转,来改变动画的内容。在此基础上最少可以再分两种(我目前知道的),
一. 每次改属性发生变化时,都需要重新绘制内容。
[支持的键路径的完整列表](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Key-ValueCodingExtensions/Key-ValueCodingExtensions.html)
可以通过下面两种方法来重新绘制
1
<pre>如果是自定义的一个layer,监听它的某个属性如,progress </br>+(BOOL)needsDisplayForKey:(NSString *)key{
if ([key isEqualToString:@"progress"])</br> return YES;</br> return [super needsDisplayForKey]
}</pre>
这样就监听了progress属性,当其变化时会在下面两个方法里重新绘制(只会调用一个)后者的优先级大于前者
<pre>- (void)drawInContext()和-(void)display()</pre>
绘制的时候动画绘比较生硬,我们可以加上过度效果
<pre>-(id<ACAction>)actionForKey:(NSString *)key{
if ([key isEqualToString:@"progress"])</br> {
##animation....
return animation </br>
};</br> return [super actionForKey:key]
}</pre>
2
在view的-(void)drawRect()
方法里绘图,每次你需要更新的时候,调用-(void)setNeedDisplay()
,然后它就会自动重新绘制所有的content
(这也是你的某一个或者几个属性发生了改变你才需要去掉用)
二.每次改属性发生变化时,控制一个或者几个layer(已经绘制好了的),去动画,用CGAffineTransform
或者CABasicAnimation
等,方式来改变layer的动作,达到不用,绘制,就能动的效果。
以上是一些复杂动画的实现思路,还有一些简单的直接在对象上面用CGAffineTransform、CABasicAnimation等就能搞定
网友评论