我正在尝试围绕其中心旋转一些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
答案 0 :(得分:36)
您可以在UIView的图层属性上使用以下动画。我测试了它。
UIView *viewToSpin = ...;
CABasicAnimation* spinAnimation = [CABasicAnimation
animationWithKeyPath:@"transform.rotation"];
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI];
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
答案 1 :(得分: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
属性控制加速和减速(以及两者之间的步骤计算)。
答案 2 :(得分:1)
获得连续旋转效果有点棘手,但我描述了一种方法here。是的,Core Animation似乎优化了转换到单位圆内最接近的结束位置。我描述的方法将一些半旋转动画链接在一起以进行完全旋转,尽管你注意到从一个动画到下一个动画的切换中有轻微的断言。
使用这些半旋转值构造的CAKeyframeAnimation也许是正确的方法。然后你也可以控制加速和减速。
答案 3 :(得分: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"];