停止CABasicAnimation在特定点(Stop CABasicAnimation at sp

2019-09-18 06:23发布

我使用的是创造了一个旋转动画CABasicAnimation 。 它旋转的UIView超过2秒。 不过,我需要能够阻止它当UIView感动。 如果我删除动画的看法是在相同的位置作为动画开始前。

这里是我的动画代码:

float duration = 2.0;
float rotationAngle = rotationDirection * ang * speed * duration;
//rotationAngle =  3*(2*M_PI);//(double)rotationAngle % (double)(2*M_PI) ;
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: rotationAngle ];
rotationAnimation.duration = duration;
rotationAnimation.cumulative = YES;
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
rotationAnimation.fillMode = kCAFillModeForwards;
rotationAnimation.delegate = self;

[self.view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

我怎样才能阻止UIView自转正确的地方是,当它触动? 我知道如何管理触控一部分,但我无法弄清楚如何停止在动画当前的角度视图。

解决方案:我通过获取表示层的角度,去除动画和设置视图的转换解决了这个问题。 下面的代码:

[self.view.layer removeAllAnimations];      
CALayer* presentLayer = self.view.layer.presentationLayer; 
float currentAngle = [(NSNumber *)[presentLayer valueForKeyPath:@"transform.rotation.z"] floatValue];
self.view.transform = CGAffineTransformMakeRotation(currentAngle);

Answer 1:

好问题! 对于这一点,它有助于了解Core Animation的架构。

如果检查出的图核心动画编程指南描述核心动画渲染架构,你可以看到,有三棵树。

你有模型树。 这就是你设置的发生什么价值。 然后是表示树。 这就是被相当多,只要运行而言发生。 然后,最后就是渲染树。 这是用户看到的内容。

在你的情况,你要查询的表示树的值。

这很容易做到。 对于您所附加动画的看法,得到了layer和该layer ,查询presentationLayer的价值观。 例如:

CATransform3D myTransform = [(CALayer*)[self.view.layer presentationLayer] transform];

有没有办法为“暂停”的动画中旬流。 所有你能做的就是查询中值,删除它,然后再从你离开的地方重新创建它。

这是一个有点痛!

看看我的一些其他职位的,我进入这个更详细一点,例如,

还原动画离开的地方,当应用程序从后台恢复

也别忘当你添加动画到视图的层,你实际上并没有改变基本观点的属性。 所以会发生什么? 我们将你得到奇怪的效果,其中动画停止,你看到它的视图的原始位置。

这就是你需要使用CAAnimation代表。 看看我的回答这个帖子里我管这个:

CABasicAnimation旋转返回到原来的位置



Answer 2:

您需要将旋转设置为旋转表示层 ,然后从层移除动画。 你可以阅读我的博客文章表示层命中测试动画层 。

设置最后一次旋转的代码会是这样的:

self.view.layer.transform = [(CALayer*)[self.view.layer presentationLayer] transform];
[self.view.layer removeAnimationForKey:@"rotationAnimation"];


文章来源: Stop CABasicAnimation at specific point