iOS CAAnimation类及其子类详解

竟然不支持 MD语法 


我的博客查看

CAAnimation 是 QuartzCore 框架下的类。 CAAnimation类,是一个抽象类。遵循CAMediaTiming协议和CAAction协议!其子类用一张图来表示:![](http://oahmyhzk1.bkt.clouddn.com/image/pngCAAnimationTRee.png)CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类。 图中紫色的线为继承某个父类,红色线为遵守某个协议。下面针对每个类一一介绍。> CAAnimationGroup 允许多个动画同时播放。> CATransition 提供渐变效果:(推拉push效果,消退fade效果,揭开reveal效果)。> CABasicAnimation 提供了对单一动画的实现。> CAKeyframeAnimation 关键桢动画,可以定义行动路线。> CAConstraint 约束类,在布局管理器类中用它来设置属性。> CAConstraintLayoutManager 约束布局管理器,是用来将多个CALayer进行布局的.各个CALayer是通过名称来区分,而布局属性是通过CAConstraint来设置的。> CATransaction 事务类,可以对多个layer的属性同时进行修改.它分隐式事务,和显式事务。## CAAnimation 类 全部属性和方法```objc// 根据属性key,返回相应的属性值public class func defaultValueForKey(key: String) -> AnyObject?/*返回指定的属性值是否可以归档。key:指定的属性。YES:指明该属性可以被归档;NO:不能被归档。*/public func shouldArchiveValueForKey(key: String) -> Bool// 速度控制函数实例对象(下面会讲)public var timingFunction: CAMediaTimingFunction?// 为CAAnimation设置代理。默认为nil。// 注意:一个CAAnimation实例,不能设置delegate为self。会引起循环引用。  public var delegate: AnyObject?// 设置是否动画完成后,动画效果从设置的layer上移除。默认为YES。  public var removedOnCompletion: Bool// 两个协议方法 extension NSObject {    // 动画开始回调    public func animationDidStart(anim: CAAnimation)    // 动画结束回调 可以通过flag判断动画是否执行完成    public func animationDidStop(anim: CAAnimation, finished flag: Bool)}```## CAMediaTimingFunction  速度控制函数```objc// 初始化 ( 常用 )public convenience init(name: String)// 指定一个三次贝塞尔曲线控制点的自定义时间 ( 一般不常用 )public init(controlPoints c1x: Float, _ c1y: Float, _ c2x: Float, _ c2y: Float)    // 返回指定索引的控制点。public func getControlPointAtIndex(idx: Int, values ptr: UnsafeMutablePointer)

/** Timing function names. **/

kCAMediaTimingFunctionLinear(线性):匀速,给你相对静态的感觉

kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进然后加速离开

kCAMediaTimingFunctionEaseOut(渐出):动画全速,然后减速的到达目的地

kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。

```

## CATransition 是CAAnimation的子类 ( 专场动画使用 )

> 能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点

> UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果

> 动画属性:

```objc

/** Transition animation subclass. **/

public class CATransition : CAAnimation {

// 动画过渡类型

public var type: String

// 动画过渡方向

public var subtype: String?

// 动画起点(在整体动画的百分比)

public var startProgress: Float

// 动画终点(在整体动画的百分比)

public var endProgress: Float

/*

为动画添加一个可选的滤镜。

如果指定,那么指定的filter必须同时支持x和y,否则该filter将不起作用。

默认值为nil。

如果设置了filter,那么,为layer设置的type和subtype属性将被忽略。

该属性只在iOS 5.0以及以后版本被支持。

如果设置了filter,那么必须实现`inputImage', `inputTargetImage' and `inputTime' input

keys, and the `outputImage' output key. Optionally it may support

the `inputExtent' key,

*/

public var filter: AnyObject?

}

/* Common transition types. */

@available(iOS 2.0, *)

public let kCATransitionFade: String

@available(iOS 2.0, *)

public let kCATransitionMoveIn: String

@available(iOS 2.0, *)

public let kCATransitionPush: String

@available(iOS 2.0, *)

public let kCATransitionReveal: String

/* Common transition subtypes. */

@available(iOS 2.0, *)

public let kCATransitionFromRight: String

@available(iOS 2.0, *)

public let kCATransitionFromLeft: String

@available(iOS 2.0, *)

public let kCATransitionFromTop: String

@available(iOS 2.0, *)

public let kCATransitionFromBottom: String

```

## CAAnimationGroup 动画组

CAAnimationGroup 是 CAAanimation 的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层,组中所有动画可以同时并发运行。

```objc

// 只有一个属性 用来保存一组动画对象的数组

public var animations: [CAAnimation]?

```

## CAPropertyAnimation  属性动画

CAPropertyAnimation 是 CAAnimation 子类,抽象类 不能直接使用 需要使用其两个子类来实现动画。

> CABasicAnimation

> CAKeyframeAnimation

```objc

/** Subclass for property-based animations. **/

public class CAPropertyAnimation : CAAnimation {

/* Creates a new animation object with its `keyPath' property set to

* 'path'. */

public convenience init(keyPath path: String?)

/* The key-path describing the property to be animated. */

// 过指定layer的一个属性名,并且对CALayer的这个属性的值进行修改,达到相应的效果。

public var keyPath: String?

/* When true the value specified by the animation will be "added" to

* the current presentation value of the property to produce the new

* presentation value. The addition function is type-dependent, e.g.

* for affine transforms the two matrices are concatenated. Defaults to

* NO. */

public var additive: Bool

/* The `cumulative' property affects how repeating animations produce

* their result. If true then the current value of the animation is the

* value at the end of the previous repeat cycle, plus the value of the

* current repeat cycle. If false, the value is simply the value

* calculated for the current repeat cycle. Defaults to NO. */

public var cumulative: Bool

/* If non-nil a function that is applied to interpolated values

* before they are set as the new presentation value of the animation's

* target property. Defaults to nil. */

public var valueFunction: CAValueFunction?

}

```

>属性说明:

–keyPath:通过指定CALayer的一个属性名称为keyPath(String类型),并且对CALayer的这个属性的值进行修改,达到相应的动画效果。比如,指定@“position”为keyPath,就修改CALayer的position属性的值,以达到平移的动画效果

[官方 CAPropertyAnimation](https://developer.apple.com/reference/quartzcore/capropertyanimation)

[官方 CAValueFunction](https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CAValueFunction_class/index.html)

## CABasicAnimation 属性动画 单一动画

CABasicAnimation 是 CAPropertyAnimation 子类 用于实现单一的动画

```objc

// keyPath 初始位置

public var fromValue: AnyObject?

// keyPath 相应的结束值 (绝对值)

public var toValue: AnyObject?

// 终结值 (相对值)

public var byValue: AnyObject?

```

>动画过程说明:

–随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue

–keyPath内容是CALayer的可动画Animatable属性

–如果fillMode=kCAFillModeForwards同时removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。

## CAKeyframeAnimation 称为关键帧动画

CAPropertyAnimation的子类,与CABasicAnimation的区别是:

–CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个数组保存这些数值

```objc

public var values: [AnyObject]?

public var path: CGPath?

public var keyTimes: [NSNumber]?

// 上面已讲

public var timingFunctions: [CAMediaTimingFunction]?

/*

该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似

const kCAAnimationLinear//线性,默认

const kCAAnimationDiscrete//离散,无中间过程,但keyTimes设置的时间依旧生效,物体跳跃地出现在各个关键帧上

const kCAAnimationPaced//平均,keyTimes跟timeFunctions失效

const kCAAnimationCubic//平均,同上

const kCAAnimationCubicPaced//平均,同上

*/

public var calculationMode: String

public var tensionValues: [NSNumber]?

public var continuityValues: [NSNumber]?

public var biasValues: [NSNumber]?

public var rotationMode: String?

```

>属性说明:

–values:上述的NSArray对象。里面的元素称为“关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧

–path:可以设置一个CGPathRef、CGMutablePathRef,让图层按照路径轨迹移动。path只对CALayer的anchorPoint和position起作用。如果设置了path,那么values将被忽略

–keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧。如果没有设置keyTimes,各个关键帧的时间是平分的

•CABasicAnimation可看做是只有2个关键帧的CAKeyframeAnimation

```objc

// 使用一下两个属性来控制 动画结束后的状态

animation.removedOnCompletion = NO;

animation.fillMode = kCAFillModeForwards;

```

[官方文档 CAKeyframeAnimation](https://developer.apple.com/reference/quartzcore/cakeyframeanimation)

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

推荐阅读更多精彩内容

  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 3,076评论 1 23
  • 显式动画 显式动画,它能够对一些属性做指定的自定义动画,或者创建非线性动画,比如沿着任意一条曲线移动。 属性动画 ...
    清风沐沐阅读 1,918评论 1 5
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,461评论 6 30
  • Core Animation Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,...
    45b645c5912e阅读 3,013评论 0 21
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,092评论 5 13