7

我正在使用使用创建的旋转动画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);
4

2 回答 2

18

好问题!为此,了解 Core Animation 架构会很有帮助。

如果您查看描述 Core Animation Rendering Architecture 的Core Animation Programming Guide中的图表,您可以看到有三棵树。

你有模型树。这就是你设置你想要发生的事情的价值的地方。然后是演示树。就运行时而言,这几乎就是发生的事情。然后,最后是渲染树。这就是用户所看到的。

在您的情况下,您想要查询表示树的值。

这很容易做到。对于您附加动画的视图,获取layerlayer,查询presentationLayer的值。例如:

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

没有办法“暂停”动画中间流。您所能做的就是查询这些值,将其删除,然后从您离开的地方重新创建它。

有点痛!

看看我的其他一些帖子,我会更详细地介绍这一点,例如

当应用程序从后台恢复时恢复动画停止的地方

也不要忘记,当您将动画添加到视图层时,您实际上并没有更改底层视图的属性。那么会发生什么?我们会在动画停止的地方获得奇怪的效果,并且您会在原始位置看到视图。

这就是您需要使用CAAnimation代表的地方。看看我对这篇文章的回答,我在其中介绍了这一点:

CABasicAnimation 旋转返回原始位置

于 2012-06-19T10:24:31.120 回答
5

您需要将旋转设置为presentationLayer的旋转,然后从图层中移除动画。您可以在我关于Hit testing animating layers的博客文章中阅读有关表示层的信息。

设置最终旋转的代码类似于:

self.view.layer.transform = [(CALayer*)[self.view.layer presentationLayer] transform];
[self.view.layer removeAnimationForKey:@"rotationAnimation"];
于 2012-06-19T10:12:57.453 回答