如何同步添加新CALayer对象与另一个对象的动画

时间:2012-07-22 23:00:16

标签: ios animation

我有两个CALayer对象 - layer1,layer2。我想执行以下操作 -

  • 将layer1添加到视图的图层用户addSublayer:
  • 使用CABasicAnimation
  • 将layer1移动到新位置
  • 将layer2添加到视图的图层
  • 将layer2移至新位置

这样,在第1层动画完成之前不会显示第2层。

我尝试过将layer2的动画上的beginTime设置为layer1动画的结束时间 - 但是在开始时间之前的间隙中显示了layer2。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我发现了一种实现结果的方法。我不确定这是最好的方法,所以仍然会对其他想法感激不尽。

我同时创建了layer1和layer2,并将addSublayer添加到view.layer。然后我为layer1设置动画以将其移动到新位置,持续时间= 0.3。对于layer2,我使用由移动(beginTime = 0.3,duration = 0.3)和使用隐藏属性的另一个动画组成的组进行动画处理。后一个动画立即隐藏了layer2,然后在beginTime = 0.3时取消隐藏它。为了实现后一个动画,我使用了CAKeyFrameAnimation,因为这个动画必须是离散的 - 完全隐藏或完全隐藏。

这是代码。我通过删除有关我的实现的细节来简化它,所以这不是我的应用程序中的实际代码 - 如果有任何错误,请道歉。

CALayer layer1 = [CALayer layer];
CALayer layer2 = [CALayer layer];

/*
 * set attributes of the layers -- cut out of this example
 */
layer1.position = toPosition1;  // positions when animation is complete
layer2.position = toPosition2;

[myView.layer addSublayer:layer1];
[myView.layer addSublayer:layer2];

// animate layer 1
CABasicAnimation* move1 = [CABasicAnimation animationWithKeyPath:@"position"];
move1.duration = 0.3;
move1.fromValue = fromPosition2;
[layer1 addAnimation:move1 forKey:nil];

// animate layer 2 with a group
CABasicAnimation* move2 = [CABasicAnimation animationWithKeyPath:@"position"];
move2.duration = 0.3;
move2.fromValue = fromPosition2;
move2.beginTime = 0.3;

CAKeyframeAnimation *show = [CAKeyframeAnimation animationWithKeyPath:@"hidden"];
show.values = [NSArray arrayWithObjects:[NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], [NSNumber numberWithBool:NO], nil];
// times are given as fractions of the duration time -- hidden for first 50% of 0.6 sec
show.keyTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:0.5], [NSNumber numberWithFloat:1.0], nil];
show.calculationMode = kCAAnimationDiscrete;
show.duration = 0.6;
show.beginTime = 0;

CAAnimationGroup *grp = [CAAnimationGroup animation];
[grp setAnimations:[NSArray arrayWithObjects:move2, show, nil ]];
grp.duration = 0.6;

[layer2 addAnimation:grp forKey:nil];