美文网首页iOS开发
iOS CAAnimation类及其子类详解

iOS CAAnimation类及其子类详解

作者: GloryMan | 来源:发表于2016-07-19 17:50 被阅读478次

    竟然不支持 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类及其子类详解

        本文链接:https://www.haomeiwen.com/subject/wgomjttx.html