iOS 用CAReplicatorLayer做點(diǎn)加載動(dòng)畫

?? 當(dāng)你司產(chǎn)品需要一些花里胡哨的加載動(dòng)畫時(shí)锣枝。扫尺。。(ps:UI小姐姐給我來個(gè)gif圖完事咒彤。UI小姐姐:滾,自己整)
比如下面的效果:

轉(zhuǎn)圈圈.gif

有的人可能說直接擼3個(gè)layer ,讓它變長變短轉(zhuǎn)圈圈咒精。
今天就來用CAReplicatorLayer 復(fù)制層來做一些這個(gè)動(dòng)畫镶柱。
既然用CAReplicatorLayer,顧名思義模叙,就是可以復(fù)制歇拆,那么看上面的gif ,很明顯 只用畫1/3的圓就行了范咨。
再分解一下動(dòng)畫故觅,看起來是有旋轉(zhuǎn),以及變長渠啊,變短的 循環(huán)過程输吏。

so 第一步

以左上的圓弧為本體,先在背景View上用UIBezierPath 畫一個(gè)圓弧替蛉,大概角度是M_PI*5/6M_PI * 3/2,由于不是完全的1/3贯溅,所以起始角度+了M_PI/6

    self.view.backgroundColor = [UIColor blackColor];
    UIView *v = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 100, 100)];
    [self.view addSubview:v];
    
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(50, 50) radius:20 startAngle:M_PI*5/6+M_PI/6 endAngle:M_PI * 3/2 clockwise:YES];
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.path = path.CGPath;
    layer.fillColor = [UIColor clearColor].CGColor;
    layer.strokeColor = [UIColor whiteColor].CGColor;
    layer.lineWidth = 5;
    layer.lineCap = @"round";
第二步

動(dòng)畫已經(jīng)被我分解了,流程是 圓弧變長灭返,停留盗迟,再變短,停留熙含。此外還加上一個(gè)整體的旋轉(zhuǎn)罚缕。
所以第二步給圓弧layer增加一個(gè)圓弧變長,停留怎静,再變短邮弹,停留的動(dòng)畫組黔衡。

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    animation.fromValue = [NSNumber numberWithFloat:0];
    animation.toValue = [NSNumber numberWithFloat: 1];
    animation.duration = 0.66;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"strokeStart"];
    anim.fromValue = [NSNumber numberWithFloat:0];
    anim.toValue = [NSNumber numberWithFloat: 0.95];
    anim.duration = 0.66;
    anim.beginTime = 0.66+0.2;
    anim.removedOnCompletion = NO;
    anim.fillMode = kCAFillModeForwards;
    
    CAAnimationGroup *group = [CAAnimationGroup animation];
    group.animations =@[animation,anim];
    group.fillMode = kCAFillModeForwards;
    group.duration = (0.66+0.2)*2;
    group.repeatCount = MAXFLOAT;
    [layer addAnimation:group forKey:nil];
第三步

添加CAReplicatorLayer,復(fù)制圓弧layer 腌乡。

    CAReplicatorLayer *replicatorrLayer = [CAReplicatorLayer layer];
    replicatorrLayer.frame = v.bounds;
    [v.layer addSublayer:replicatorrLayer];
    [replicatorrLayer addSublayer:layer];
    
    replicatorrLayer.instanceCount = 3; //復(fù)制 sublayer 的個(gè)數(shù)盟劫,包括創(chuàng)建的第一個(gè)sublayer 在內(nèi)的個(gè)數(shù)
    replicatorrLayer.instanceDelay = 0; //設(shè)置動(dòng)畫延遲執(zhí)行的時(shí)間
    replicatorrLayer.instanceAlphaOffset = 0;   //設(shè)置透明度遞減
    replicatorrLayer.instanceTransform = CATransform3DMakeRotation(M_PI*2/3, 0, 0, 1);//復(fù)制條位置偏移
最后一步

給整體增加一個(gè)旋轉(zhuǎn)動(dòng)畫,完事与纽。

    CABasicAnimation *animation1 = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    animation1.fromValue = [NSNumber numberWithFloat:0];
    animation1.toValue = [NSNumber numberWithFloat:M_PI*2/3];
    animation1.duration = 0.66;
    animation1.removedOnCompletion = NO;
    animation1.fillMode = kCAFillModeForwards;
    
    CABasicAnimation *animation2 = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    animation2.fromValue = [NSNumber numberWithFloat:0];
    animation2.toValue = [NSNumber numberWithFloat:M_PI*2/3+M_PI/6];
    animation2.duration = 0.66;
    animation2.beginTime = 0.66+0.2;
    animation2.removedOnCompletion = NO;
    animation2.fillMode = kCAFillModeForwards;
    
    CAAnimationGroup *group1 = [CAAnimationGroup animation];
    group1.animations =@[animation1,animation2];
    group1.duration = (0.66+0.2)*2;
    group1.repeatCount = MAXFLOAT;
    [replicatorrLayer addAnimation:group1 forKey:nil];
以上代碼最后做出來的效果如下:

轉(zhuǎn)loading.gif

可以看到基本上是一毛一樣的凰兑。
當(dāng)然CAReplicatorLayer還能做出很多有意思的效果,自己可以去摸索摸索硬耍。
還有一些其他的效果:(代碼都在文末倉庫)
loading.gif

loading1.gif

完整代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灿巧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子僚碎,更是在濱河造成了極大的恐慌猴娩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺阐,死亡現(xiàn)場(chǎng)離奇詭異卷中,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)渊抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蟆豫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腰吟,你說我怎么就攤上這事无埃。” “怎么了毛雇?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵嫉称,是天一觀的道長。 經(jīng)常有香客問我灵疮,道長织阅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任震捣,我火速辦了婚禮荔棉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒿赢。我一直安慰自己润樱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布羡棵。 她就那樣靜靜地躺著壹若,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上店展,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天养篓,我揣著相機(jī)與錄音,去河邊找鬼赂蕴。 笑死柳弄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的概说。 我是一名探鬼主播碧注,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼席怪!你這毒婦竟也來了应闯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤挂捻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后船万,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刻撒,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年耿导,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了声怔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舱呻,死狀恐怖醋火,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箱吕,我是刑警寧澤芥驳,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站茬高,受9級(jí)特大地震影響兆旬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怎栽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一丽猬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熏瞄,春花似錦脚祟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春沥寥,著一層夾襖步出監(jiān)牢的瞬間碍舍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工邑雅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留片橡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓淮野,卻偏偏與公主長得像捧书,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骤星,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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