围绕其中心旋转UIView多次

16

我想要围绕中心旋转一些 UIView,所以简单的代码如下(伪代码):

[UIView beginAnimations:@"crazyRotate" context:nil];
[UIView setAnimationDuration:1.0];
someview.transform = CGAffineTransformMakeRotation(angle);
[UIView commitAnimations]

现在,如果我将角度设置为M_PI/2,物体会很好地旋转。如果我将它设置为2*M_PI,它就“什么也不做”。我可以理解矩阵会转化为一些什么都不做的东西(旋转360意味着在某种意义上“停留”),但是我想让它旋转5次(想象一下报纸旋转比例效果——我不擅长描述,希望有人能理解)。因此,我尝试将角度设置为180度(M_PI)并添加嵌套的animatationBlock。但是我猜想由于我再次设置了相同的属性(someview.transition),它以某种方式忽略了它。我尝试将动画的重复次数设置为2,角度为M_PI,但似乎只是旋转了180度,回到了直立的位置,然后再次启动旋转。

所以,我有点没有头绪,任何帮助都将不胜感激! --t


你可以从这里开始:https://github.com/jonasschnelli/UIView-i7Rotate360,非常容易实现和更改。 - Jonas Schnelli
可能是这个问题的重复:UIView无限360度旋转动画? - Stephen J
4个回答

36
您可以在UIView的layer属性上使用以下动画。我已经测试过了。
Objective-C
UIView *viewToSpin = ...;    
CABasicAnimation* spinAnimation = [CABasicAnimation
                                  animationWithKeyPath:@"transform.rotation"];
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI];
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"];

Swift 5.0

let viewToSpin = UIView() // However you have initialized your view
let spinAnimation = CABasicAnimation.init(keyPath: "transform.rotation")
spinAnimation.toValue = NSNumber(value: 5.0 * 2.0 * Float.pi)
viewToSpin.layer.add(spinAnimation, forKey: "spinAnimation")

我该如何减缓这个动画的速度? - mahboudz
为了考虑动画定时问题,请参阅CAMediaTiming协议的参考资料,该协议由CABasicAnimation实现。特别是,您可能想设置“duration”属性。上面的代码使用默认持续时间0.25秒。 - Jason Medeiros

6

正如Brad Larson所示,您可以使用CAKeyframeAnimation来实现此操作。例如:

CAKeyframeAnimation *rotationAnimation;
rotationAnimation = 
   [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

rotationAnimation.values = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0 * M_PI], 
                            [NSNumber numberWithFloat:0.75 * M_PI], 
                            [NSNumber numberWithFloat:1.5 * M_PI], 
                            [NSNumber numberWithFloat:2.0 * M_PI], nil]; 
rotationAnimation.calculationMode = kCAAnimationPaced;
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.fillMode = kCAFillModeForwards;
rotationAnimation.timingFunction = 
   [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
rotationAnimation.duration = 10.0;

CALayer *layer = [viewToSpin layer];
[layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

您可以使用 rotationAnimation.duration 属性控制整个动画的持续时间,使用 rotationAnimation.timingFunction 属性来控制加速和减速(以及计算中间步骤)。

1
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 8.0f;
animation.repeatCount = INFINITY;
[self.myView.layer addAnimation:animation forKey:@"SpinAnimation"];

1

实现连续旋转效果有些棘手,但我在这里描述了一种方法。是的,核心动画似乎会将变换优化为单位圆内最近的结束位置。我在那里描述的方法将几个半旋转动画链在一起以进行完整旋转,尽管您会注意到从一个动画到下一个的交接处略微出现了抖动。

也许使用这些半旋转值构建的CAKeyframeAnimation是正确的方法。然后,您还可以控制加速和减速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接