我正在写一个iPhone应用程序,我有一个我想要向外旋转的图像。
目前我的代码看起来像这样(包含在beginAnimations / commitAnimations块中):
scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f);
swirl = CGAffineTransformRotate(scale, M_PI);
[player setTransform:swirl];
[player setAlpha:0.0f];
但是我发现如果我尝试将旋转角度更改为4 * M_PI,它根本不会旋转。是否可以使用CGAffineTransformRotate进行720˚旋转,还是必须切换到其他技术?
如果我必须切换到另一种技术,你会建议使用另一个线程(或计时器)来自己动画,还是OpenGL会更好?
谢谢,
布雷克。
答案 0 :(得分:64)
您可以按一定数量的弧度旋转视图,无论它是小于完整旋转还是完整旋转的多倍,而不必将旋转分割成碎片。作为示例,以下代码将每秒一次旋转视图达指定的秒数。您可以轻松地修改它以按一定数量的旋转或某些弧度旋转视图。
- (void) runSpinAnimationWithDuration:(CGFloat) duration;
{
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ];
rotationAnimation.duration = duration;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = 1.0;
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}
答案 1 :(得分:5)
您可以,但您需要将动画拆分为半圈旋转。我提供了一个响应this question的示例,使用应用于视图下方图层的重复CABasicAnimation。正如我在那里建议的那样,将这些半旋转作为CAKeyframeAnimation的一部分可能是更好的结构方式,因为动画会更平滑(在我的例子中,在半旋转之间有轻微的故障),你可以做在开始和结束时都有一个很好的加速/减速。
答案 2 :(得分:5)
对标题的回答:是的,CGAffineTransform可以旋转360度以上 回答问题:是的,但你不能动画它,因为没有任何动画。
请记住the affine transformation is a matrix,并且旋转矩阵包含预计算的正弦和余弦数字。就像你说的那样:
CGFloat angle = 4.0 * M_PI;
NSAffineTransformStruct matrix = {
.m11 = cos(angle),
.m12 = sin(angle),
.m21 = -sin(angle),
.m22 = cos(angle),
.tx = 0.0,
.ty = 0.0
};
NSAffineTransform *transform = [NSAffineTransform transform];
[transform setTransformStruct:matrix];
现在,让我们回顾cos
和sin
的一些示例值:
cos(0π)
= 1 sin(0π)
= 0 cos(2π)
= 1 sin(2π)
= 0 cos(4π)
= 1 sin(4π)
= 0 请记住,矩阵不包含角度 - 它只包含余弦和正弦。并且这些值不会从一个圆的倍数变为另一个。因此,没有什么可以动画的。
(注意,Calculator.app为cos(xπ)和sin(xπ)提供了错误的结果。尝试Grapher,calc或Google。)
您需要将动画拆分为圆圈的分数。半圈布拉德拉森建议会做得很好。