一篇文章搞定 CASpringAnimation 彈簧動畫

今天對iOS動畫再學(xué)習(xí)時懊纳,發(fā)現(xiàn)有個知識空白网持。這就是iOS 9 新出的CASpringAnimation,是蘋果專門解決開發(fā)者關(guān)于彈簧動畫的這個需求而封裝的類长踊。CASpringAnimation 繼承于CABaseAnimation。下面我們就詳細(xì)解說一下有關(guān)CASpringAnimation類的相關(guān)屬性和用法萍倡。

CASpringAnimation相關(guān)屬性

#pragma  CASpringAnimation 彈簧動畫 的相關(guān)屬性
    /* The mass of the object attached to the end of the spring. Must be greater
     than 0. Defaults to one. */
    
    //質(zhì)量身弊,影響圖層運動時的彈簧慣性,質(zhì)量越大,彈簧拉伸和壓縮的幅度越大
        @property CGFloat mass;
    
    /* The spring stiffness coefficient. Must be greater than 0.
     * Defaults to 100. */
    
    //剛度系數(shù)(勁度系數(shù)/彈性系數(shù))阱佛,剛度系數(shù)越大帖汞,形變產(chǎn)生的力就越大,運動越快
        @property CGFloat stiffness;
    
    /* The damping coefficient. Must be greater than or equal to 0.
     * Defaults to 10. */
    
    //阻尼系數(shù)凑术,阻止彈簧伸縮的系數(shù)翩蘸,阻尼系數(shù)越大,停止越快
        @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
    //速率為正數(shù)時催首,速度方向與運動方向一致,速率為負(fù)數(shù)時泄鹏,速度方向與運動方向相反
        @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. */
    
    //估算時間 返回彈簧動畫到停止時的估算時間郎任,根據(jù)當(dāng)前的動畫參數(shù)估算
        @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模擬的是質(zhì)量备籽,影響圖層運動時的彈簧慣性舶治,質(zhì)量越大,彈簧拉伸和壓縮的幅度越大 默認(rèn)值:1 车猬;

    springAnimation.mass = 5;

stiffness剛度系數(shù)(勁度系數(shù)/彈性系數(shù))霉猛,剛度系數(shù)越大,形變產(chǎn)生的力就越大珠闰,運動越快惜浅。默認(rèn)值: 100 ;

    springAnimation.stiffness = 100;

damping阻尼系數(shù)铸磅,阻止彈簧伸縮的系數(shù)赡矢,阻尼系數(shù)越大,停止越快阅仔。默認(rèn)值:10吹散;

    springAnimation.damping = 10;

initialVelocity初始速率,動畫視圖的初始速度大小八酒。默認(rèn)值:0 空民;
速率為正數(shù)時,速度方向與運動方向一致羞迷,速率為負(fù)數(shù)時界轩,速度方向與運動方向相反;

    springAnimation.initialVelocity = 10;

settlingDuration估算時間 返回彈簧動畫到停止時的估算時間衔瓮,根據(jù)當(dāng)前的動畫參數(shù)估算浊猾;

    springAnimation.duration = springAnimation.settlingDuration;

removedOnCompletion 默認(rèn)為YES 。當(dāng)設(shè)置為YES時热鞍,動畫結(jié)束后葫慎,移除layer層的衔彻;當(dāng)設(shè)置為NO時,保持動畫結(jié)束時layer的狀態(tài)偷办;

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

fillMode屬于QuartzCore動畫中的的屬性艰额,文章末尾我會詳細(xì)談?wù)劇?/p>

   springAnimation.fillMode = kCAFillModeBoth;

addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key將動畫添加到視圖的layer層,“key”作為這個動畫的唯一標(biāo)示符椒涯,可以是任意唯一的字符串或為空柄沮;

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

實現(xiàn)代碼展示

#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];
    }
    
    
    //質(zhì)量,影響圖層運動時的彈簧慣性废岂,質(zhì)量越大祖搓,彈簧拉伸和壓縮的幅度越大 Defaults to one
    springAnimation.mass = 5;
    //剛度系數(shù)(勁度系數(shù)/彈性系數(shù)),剛度系數(shù)越大泪喊,形變產(chǎn)生的力就越大棕硫,運動越快 Defaults to 100
    springAnimation.stiffness = 100;
    //阻尼系數(shù),阻止彈簧伸縮的系數(shù)袒啼,阻尼系數(shù)越大哈扮,停止越快 Defaults to 10
    springAnimation.damping = 10;
    //初始速率,動畫視圖的初始速度大小 Defaults to zero
    //速率為正數(shù)時蚓再,速度方向與運動方向一致滑肉,速率為負(fù)數(shù)時,速度方向與運動方向相反
    springAnimation.initialVelocity = 10;
    //估算時間 返回彈簧動畫到停止時的估算時間摘仅,根據(jù)當(dāng)前的動畫參數(shù)估算
    NSLog(@"====%f",springAnimation.settlingDuration);
    springAnimation.duration = springAnimation.settlingDuration;
    
    //removedOnCompletion 默認(rèn)為YES 為YES時靶庙,動畫結(jié)束后,恢復(fù)到原來狀態(tài)
    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 彈簧動畫源碼下載


知識點擴(kuò)充

fillMode屬性的設(shè)置:

kCAFillModeRemoved  這個是默認(rèn)值娃属,也就是說當(dāng)動畫開始前和動畫結(jié)束后六荒,
動畫對layer都沒有影響,動畫結(jié)束后矾端,layer會恢復(fù)到之前的狀態(tài)

kCAFillModeForwards 當(dāng)動畫結(jié)束后掏击,layer會一直保持著動畫最后的狀態(tài)

kCAFillModeBackwards  在動畫開始前,只需要將動畫加入了一個layer秩铆,
layer便立即進(jìn)入動畫的初始狀態(tài)并等待動畫開始砚亭。

kCAFillModeBoth 這個其實就是上面兩個的合成.動畫加入后開始之前,
layer便處于動畫初始狀態(tài)殴玛,動畫結(jié)束后layer保持動畫最后的狀態(tài)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捅膘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滚粟,更是在濱河造成了極大的恐慌寻仗,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凡壤,死亡現(xiàn)場離奇詭異愧沟,居然都是意外死亡蔬咬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門沐寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盖奈,你說我怎么就攤上這事混坞。” “怎么了钢坦?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵究孕,是天一觀的道長。 經(jīng)常有香客問我爹凹,道長厨诸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任禾酱,我火速辦了婚禮微酬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颤陶。我一直安慰自己颗管,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布滓走。 她就那樣靜靜地躺著垦江,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搅方。 梳的紋絲不亂的頭發(fā)上比吭,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音姨涡,去河邊找鬼衩藤。 笑死,一個胖子當(dāng)著我的面吹牛绣溜,可吹牛的內(nèi)容都是我干的慷彤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼怖喻,長吁一口氣:“原來是場噩夢啊……” “哼底哗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锚沸,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤跋选,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哗蜈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體前标,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡坠韩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炼列。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片只搁。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俭尖,靈堂內(nèi)的尸體忽然破棺而出氢惋,到底是詐尸還是另有隱情,我是刑警寧澤稽犁,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布焰望,位于F島的核電站,受9級特大地震影響已亥,放射性物質(zhì)發(fā)生泄漏熊赖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一虑椎、第九天 我趴在偏房一處隱蔽的房頂上張望震鹉。 院中可真熱鬧,春花似錦绣檬、人聲如沸足陨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墨缘。三九已至,卻和暖如春零抬,著一層夾襖步出監(jiān)牢的瞬間镊讼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工平夜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蝶棋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓忽妒,卻偏偏與公主長得像玩裙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子段直,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容