CAAnimation 正在覆盖以前的 CAAnimation 动画
Posted
技术标签:
【中文标题】CAAnimation 正在覆盖以前的 CAAnimation 动画【英文标题】:CAAnimation is overriding previous CAAnimation animation 【发布时间】:2018-07-29 11:52:07 【问题描述】:我有一个这样的场景:
-
我添加了一个 CAAnimation 图层,将其转换为特定帧。开始时间为 0。
然后我添加另一个 CAAnimation 将其转换为不同的帧。开始时间为 0.5。
发生的情况是图层立即获得第二帧(没有动画),并且在第一个动画时间过去后第二个动画正确完成。
这是动画创建代码:
+ (CAAnimation *)transformAnimation:(CALayer *)layer
fromFrame:(CGRect)fromFrame
toFrame:(CGRect)toFrame
fromAngle:(CGFloat)fromAngle
toAngle:(CGFloat)toAngle
anchor:(CGPoint)anchor
vertical:(BOOL)vertical
begin:(CFTimeInterval)begin
duration:(CFTimeInterval)duration
CATransform3D fromTransform = makeTransform(layer, fromFrame, fromAngle, anchor, vertical);
CATransform3D midTransform1 = makeTransformLerp(layer, fromFrame, toFrame, fromAngle, toAngle, anchor, 0.33, vertical);
CATransform3D midTransform2 = makeTransformLerp(layer, fromFrame, toFrame, fromAngle, toAngle, anchor, 0.66, vertical);
CATransform3D toTransform = makeTransform(layer, toFrame, toAngle, anchor, vertical);
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
animation.values = @[[NSValue valueWithCATransform3D:fromTransform],
[NSValue valueWithCATransform3D:midTransform1],
[NSValue valueWithCATransform3D:midTransform2],
[NSValue valueWithCATransform3D:toTransform]
];
animation.beginTime = begin;
animation.duration = duration;
animation.fillMode = kCAFillModeBoth;
animation.calculationMode = kCAAnimationPaced;
animation.removedOnCompletion = NO;
return animation;
编辑 在大多数情况下,此代码运行良好并且动画排序正确。但是,如果我将 1 个变换动画设置为在 2 秒后开始,然后将另一个变换设置为在 4 秒后开始。第一个变换立即应用于图层,第二个动画从那里开始。
知道如何将动画分开运行吗? (我不喜欢使用完成块)
谢谢
【问题讨论】:
您能否提供一些您想要或做什么的代码,我很乐意提供帮助。 单独开始时间就可以了。抱歉,您能提供更多上下文吗? @agibson007 编辑问题,谢谢 k.您是否还可以共享将其添加到图层的行。我想我有你的答案,但想确定一下。我是否理解您希望他们按顺序行动的权利。意思是如果你开始一个持续时间为 0.5 秒的动画,而另一个开始时间为 0.4 的动画持续时间为 0.5,你真的不希望它开始到 0.5 然后继续持续时间为 0.5?只是想确认一下。 目前,我没有更新模态层。 【参考方案1】:最简单和最明显的早期修复方法是更改填充模式,以便第二个动画不会在两端钳制覆盖前一个动画。
animation.fillMode = kCAFillModeForwards;
我也会把开始时间调整为
animation.beginTime = CACurrentMediaTime() + begin;
如果是开始时间和持续时间重叠的问题,而不是这个,请告诉我,我也可以提供。
【讨论】:
以上是关于CAAnimation 正在覆盖以前的 CAAnimation 动画的主要内容,如果未能解决你的问题,请参考以下文章
使用 CAAnimation 检测正在动画的 uiview 子视图的触摸