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)

你可能感兴趣的:(iOS CAAnimation类及其子类详解)