一篇文章搞定 CASpringAnimation 弹簧动画

今天对iOS动画再学习时,发现有个知识空白。这就是iOS 9 新出的CASpringAnimation,是苹果专门解决开发者关于弹簧动画的这个需求而封装的类。CASpringAnimation 继承于CABaseAnimation。下面我们就详细解说一下有关CASpringAnimation类的相关属性和用法。

CASpringAnimation相关属性

#pragma  CASpringAnimation 弹簧动画 的相关属性
    /* The mass of the object attached to the end of the spring. Must be greater
     than 0. Defaults to one. */
    
    //质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大
        @property CGFloat mass;
    
    /* The spring stiffness coefficient. Must be greater than 0.
     * Defaults to 100. */
    
    //刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快
        @property CGFloat stiffness;
    
    /* The damping coefficient. Must be greater than or equal to 0.
     * Defaults to 10. */
    
    //阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快
        @property CGFloat damping;
    
    /* The initial velocity of the object attached to the spring. Defaults
     * to zero, which represents an unmoving object. Negative values
     * represent the object moving away from the spring attachment point,
     * positive values represent the object moving towards the spring
     * attachment point. */
    
    //初始速率,动画视图的初始速度大小 Defaults to zero
    //速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反
        @property CGFloat initialVelocity;
    
    /* Returns the estimated duration required for the spring system to be
     * considered at rest. The duration is evaluated for the current animation
     * parameters. */
    
    //估算时间 返回弹簧动画到停止时的估算时间,根据当前的动画参数估算
        @property(readonly) CFTimeInterval settlingDuration;

CASpringAnimation解析

CASpringAnimation初始化

初始化CASpringAnimation一般使用animationWithKeyPath:方法,这里的KeyPath可以是@"position" 这用点表示路径@"position.x"用x轴表示路径@"position.y"用y轴表示路径@"bounds"这个表示会改变对象的宽高

/* Creates a new animation object with its `keyPath' property set to
 * 'path'. */
CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:@"bounds"];

CASpringAnimation属性赋值

mass模拟的是质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大 默认值:1 ;

    springAnimation.mass = 5;

stiffness刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快。默认值: 100 ;

    springAnimation.stiffness = 100;

damping阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快。默认值:10;

    springAnimation.damping = 10;

initialVelocity初始速率,动画视图的初始速度大小。默认值:0 ;
速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反;

    springAnimation.initialVelocity = 10;

settlingDuration估算时间 返回弹簧动画到停止时的估算时间,根据当前的动画参数估算;

    springAnimation.duration = springAnimation.settlingDuration;

removedOnCompletion 默认为YES 。当设置为YES时,动画结束后,移除layer层的;当设置为NO时,保持动画结束时layer的状态;

//Determines if the animation is removed from the target layer’s animations upon completion.
    springAnimation.removedOnCompletion = NO;

fillMode属于QuartzCore动画中的的属性,文章末尾我会详细谈谈。

   springAnimation.fillMode = kCAFillModeBoth;

addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key将动画添加到视图的layer层,“key”作为这个动画的唯一标示符,可以是任意唯一的字符串或为空;

    [self.jellyView.layer addAnimation:springAnimation forKey:@"springAnimation"];

实现代码展示

#pragma mark iOS9 CASpringAnimation 弹簧动画

- (void)springAnimationTextAction:(CGPoint)point {
    
    CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:@"bounds"];
    
    //路径计算模式 (@"position")
    if ([springAnimation.keyPath isEqualToString:@"position"]) {
        
        springAnimation.fromValue = [NSValue valueWithCGPoint:self.jellyView.layer.position];
        springAnimation.toValue = [NSValue valueWithCGPoint:point];
    }else if ([springAnimation.keyPath isEqualToString:@"position.x"]) {
        
        springAnimation.fromValue = @(self.jellyView.layer.position.x);
        springAnimation.toValue = @(point.x);
    }else if ([springAnimation.keyPath isEqualToString:@"position.y"]) {
        
        springAnimation.fromValue = @(self.jellyView.layer.position.y);
        springAnimation.toValue = @(point.y);
    }else if ([springAnimation.keyPath isEqualToString:@"bounds"]) {
        
        //        CGFloat width = arc4random()%1000*0.1f+20.0f;
        //        CGFloat height = arc4random()%30*0.1f;
        springAnimation.fromValue = [NSValue valueWithCGRect:CGRectMake(point.x, point.y, 60, 60)];
        springAnimation.toValue = [NSValue valueWithCGRect:self.jellyView.frame];
    }
    
    
    //质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大 Defaults to one
    springAnimation.mass = 5;
    //刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快 Defaults to 100
    springAnimation.stiffness = 100;
    //阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快 Defaults to 10
    springAnimation.damping = 10;
    //初始速率,动画视图的初始速度大小 Defaults to zero
    //速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反
    springAnimation.initialVelocity = 10;
    //估算时间 返回弹簧动画到停止时的估算时间,根据当前的动画参数估算
    NSLog(@"====%f",springAnimation.settlingDuration);
    springAnimation.duration = springAnimation.settlingDuration;
    
    //removedOnCompletion 默认为YES 为YES时,动画结束后,恢复到原来状态
    springAnimation.removedOnCompletion = NO;
    //    springAnimation.fillMode = kCAFillModeBoth;
    
    [self.jellyView.layer addAnimation:springAnimation forKey:@"springAnimation"];
    
}

这个动画是animationWithKeyPath:(nullable NSString *)pathpath为@"bounds"时

CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:@"bounds"];

bounds——textq.gif

这个动画是animationWithKeyPath:(nullable NSString *)pathpath为@"position"时

CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:@"position"];

position——textq.gif

这个动画是animationWithKeyPath:(nullable NSString *)pathpath为@"position.y"时

CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:@"position.y"];
position.y——textq.gif

CASpringAnimation 弹簧动画源码下载


知识点扩充

fillMode属性的设置:

kCAFillModeRemoved  这个是默认值,也就是说当动画开始前和动画结束后,
动画对layer都没有影响,动画结束后,layer会恢复到之前的状态

kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态

kCAFillModeBackwards  在动画开始前,只需要将动画加入了一个layer,
layer便立即进入动画的初始状态并等待动画开始。

kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,
layer便处于动画初始状态,动画结束后layer保持动画最后的状态

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

推荐阅读更多精彩内容