竟然不支持 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)