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再次设置相同的属性()它会以某种方式忽略它)。我尝试使用角度 M_PI 将动画的重复计数设置为 2,但它似乎只是旋转 180,回到直线位置,然后再次启动旋转。

所以,我有点想法,任何帮助表示赞赏!--t

4

4 回答 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"];

斯威夫特 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")
于 2009-02-06T00:26:09.710 回答
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

于 2012-02-28T23:37:19.447 回答
1

获得连续旋转效果有点棘手,但我在这里描述了一种方法。是的,Core Animation 似乎优化了单位圆内最近结束位置的变换。我在那里描述的方法将几个半旋转动画链接在一起以进行完整旋转,尽管您确实注意到从一个动画到下一个动画的切换中有轻微的卡顿。

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

于 2009-02-06T13:50:59.027 回答
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"];
于 2015-06-22T15:35:04.643 回答