我正在写一个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会更好?
谢谢,
布莱克.
您可以按一定数量的弧度旋转视图,无论它是小于完整旋转还是完整旋转的多倍,而不必将旋转分割成碎片.作为示例,以下代码将每秒一次旋转视图达指定的秒数.您可以轻松地修改它以通过一定数量的旋转或一定数量的弧度来旋转视图.
- (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"]; }
你可以,但你需要将动画分成半圆旋转.我提供了一个这样的例子来回答这个问题,使用一个重复的CABasicAnimation应用于视图下面的图层.正如我在那里建议的那样,将这些半旋转作为CAKeyframeAnimation的一部分可能是更好的结构方式,因为动画会更平滑(在我的例子中,在半旋转之间有轻微的故障),你可以做开始和结束时加速/减速都很好.
标题回答:是的,CGAffineTransform可以旋转360度以上.
回答问题:是的,但你不能动画它,因为没有任何动画.
请记住,仿射变换是一个矩阵,旋转矩阵包含预先计算的正弦和余弦数.就像你说的那样:
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.)
您需要将动画拆分为圆形的分数.半圈布拉德拉森建议会做得很好.