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é)論:
- 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。
- 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é)束。
- 當(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:@""];