我在同时为多个CALayers制作动画时遇到了一些问题,并希望有人能指出我正确的方向。
我的应用包含一系列CALayer。每个图层的位置设置为(previousLayer.position.y + previousLayer.bounds.height)
,它基本上将它们放置为类似于表格。然后,我有一个方法,每次调用时,都会向堆栈添加一个新图层,并将其Y位置设置为0.然后,数组中所有其他图层的Y位置将被新的高度偏移。图层(基本上将所有旧图层向下推)。
我遇到的问题是在上一个动画完成之前阻止添加新图层。有没有办法告诉隐式动画何时完成?或者,如果我使用CABasicAnimation
和animationDidFinish
,有没有办法告诉哪个对象在调用animationDidFinish
时完成了动画?
答案 0 :(得分:4)
您可以为动画对象上的键设置任意值。这意味着你可以将你动画的图层与动画相关联,然后在-animationDidStop中查询:完成:你用这种方式创建动画:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
// set other fields...
[anim setValue:layerToAnimate forKey:@"layer"];
// Start the animation
[layerToAnimate addAnimation:anim forKey:nil];
然后在动画停止时检查该值:
- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag
{
CALayer *animatedLayer = [animation valueForKey:@"layer"];
// do something with the layer based on some condition...
// spin off the next animation...
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[animatedLayer setPosition:position];
[CATransaction commit];
}
这是显式动画,但它应该能满足您的需求。
答案 1 :(得分:1)
您可以尝试在CATransaction
中包围您的代码。以下是Swift 3中的内容:
CATransaction.begin()
CATransaction.setCompletionBlock({
// run after the animations
})
// animtations
CATransaction.commit()
答案 2 :(得分:0)
事实证明,不是将CABasicAnimation直接添加到CALayer,我不得不将它添加到图层的'actions'字典中......这会在动画结束后将图层保留在它的最终位置,但仍然会调用' animationDidFinish'方法。
-(void)startAnimation {
if(!animating){
animating = YES;
for(int i=0; i<[tweets count]; i++) {
//get the layer
CETweetLayer *currentLayer = [tweets objectAtIndex:i];
//setup the orgin and target y coordinates
float targetY = currentLayer.position.y + offset;
//setup the animation
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
anim.delegate = self;
currentLayer.actions = [NSDictionary dictionaryWithObject:anim forKey:@"position"];
currentLayer.position = CGPointMake(self.bounds.size.width/2, targetY);
}
}
}
然后......
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
animating = NO;
}