iOS動畫:CAAnimationGroup

CAAnimationGroup直接繼承自CAAnimation。它自身一個(gè)非常簡單的動畫類,只擴(kuò)展了一個(gè)屬性NSArray<CAAnimation *> *animations用來存儲子動畫。CAAnimationGroup可以將多個(gè)子動畫并發(fā)運(yùn)行在自己的時(shí)間空間中。

這篇文章重點(diǎn)討論beginTime、duration、fillMode、removedOnCompletion等屬性同時(shí)在CAAnimationGroup和子動畫中同時(shí)設(shè)置時(shí),所產(chǎn)生的效果。

這里先說一下結(jié)論:

  1. CAAnimationGroup的beginTime用來控制整個(gè)動畫組的開始時(shí)間可以設(shè)置為CACurrentMediaTime()+N,N代表動畫組的開始時(shí)間從單簽時(shí)間延遲N秒。子動畫中的beginTime用來設(shè)置子動畫在CAAnimationGroup時(shí)間空間中開始時(shí)間向后的延時(shí)時(shí)間,它可以設(shè)置為N。例如CAAnimationGroup的beginTime=CACurrentMediaTime()+2,子動畫的設(shè)置為beginTime = 1. 則表示子動畫在CAAnimationGroup動畫開始后1秒后才進(jìn)行子動畫的運(yùn)行,即可以近似理解為是CACurrentMediaTime()+3。
  2. CAAnimationGroup的duration控制整個(gè)動畫組的動畫運(yùn)行時(shí)間,子動畫的duration空值子動畫的動畫運(yùn)行時(shí)間。當(dāng)CAAnimationGroup的動畫時(shí)間運(yùn)行時(shí)間結(jié)束時(shí),子動畫未運(yùn)行完成則子動畫會被剪切。例如CAAnimationGroup的duration = gDuration,子動畫的beginTime = cBeginTime。則子動畫會運(yùn)行到gDuration-cBeginTime時(shí),動畫結(jié)束。
  3. 當(dāng)需要動畫在結(jié)束是保持動畫的最終狀態(tài),一般會設(shè)置fillMode =kCAFillModeForwards、removedOnCompletion=NO。那到底該設(shè)置CAAnimationGroup的相關(guān)屬性還是子動畫的相關(guān)屬性呢?特別是子動畫和CAAnimationGroup的運(yùn)行時(shí)間不一致時(shí)該如何設(shè)置?
    結(jié)論如下:
    3.1 子動畫的fillMode、kCAFillModeForwards控制子動畫,在動畫組時(shí)間內(nèi)動畫的最終狀態(tài)。如果子動畫提前于CAAnimationGroup運(yùn)行結(jié)束,則子動畫會在CAAnimationGroup運(yùn)行的剩余時(shí)間內(nèi)保持子動畫的最終狀態(tài),當(dāng)CAAnimationGroup運(yùn)行完成后子動畫回復(fù)到原始狀態(tài)(CAAnimationGroup 未設(shè)置fillMode =kCAFillModeForwards、removedOnCompletion=NO的情況)
    3.2 CAAnimationGroup的fillMode、kCAFillModeForwards控制CAAnimationGroup在運(yùn)行結(jié)束時(shí),是否保持子動畫當(dāng)前的動畫狀態(tài)(有可能尚未完成,取當(dāng)前呈現(xiàn)樹的狀態(tài))。
    [self.view.layer addSublayer:self.layer];
    
    CABasicAnimation *aniPosition = [CABasicAnimation animation];
    //在動畫組運(yùn)行結(jié)束后子動畫仍然沒有運(yùn)行完成,因此最終子動畫會在其開始2秒時(shí)停住。并保持最終狀態(tài)
    aniPosition.beginTime = 1;
    aniPosition.duration = 3;
    aniPosition.keyPath = @"position";
    aniPosition.fromValue = [NSValue valueWithCGPoint:CGPointMake(25, self.view.center.y)];
    aniPosition.toValue = [NSValue valueWithCGPoint:CGPointMake([UIScreen mainScreen].bounds.size.width-25, self.view.center.y)];
    aniPosition.fillMode = kCAFillModeBoth;
    aniPosition.removedOnCompletion = NO;
    
    CABasicAnimation *colorBasic = [CABasicAnimation animation];
    colorBasic.duration = 3;
    colorBasic.keyPath = @"backgroundColor";
    colorBasic.fromValue = (__bridge id _Nullable)([UIColor redColor].CGColor);
    colorBasic.toValue = (__bridge id _Nullable)([UIColor blackColor].CGColor);
    colorBasic.fillMode = kCAFillModeBoth;
    colorBasic.removedOnCompletion = NO;
    
    CAAnimationGroup *group = [CAAnimationGroup animation];
    group.animations = @[aniPosition, colorBasic];
    group.duration = 3;
    group.beginTime = CACurrentMediaTime()+3;
    group.fillMode = kCAFillModeBoth;
    group.removedOnCompletion = NO;
    [self.layer addAnimation:group forKey:@""];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容