我正在制作益智游戏,我需要在每次双击时将拼图旋转到90
度角。
我尝试过两种不同的方式。第一种方法是这个:
[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(90);
[UIView commitAnimations];
唯一的问题是这件作品没有旋转90
度;它旋转大约100
度,并且此动画正在修改拼图块UIView
的框架。
这是我的控制台输出:
frame BEFORE ROTATION: {{35, 178}, {80, 80}}
frame AFTER ROTATION: {{21.3172, 164.317}, {107.366, 107.366}}
我尝试的第二种方法就是这个:
CABasicAnimation* spinAnimation = [CABasicAnimation
animationWithKeyPath:@"transform.rotation"];
spinAnimation.toValue = [NSNumber numberWithFloat:1];
[self.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
此方法的问题在于,在完成旋转后,它会将我的UIView
反转为之前的状态。
如何在没有这些问题的情况下用动画旋转拼图?
答案 0 :(得分:48)
尝试
[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(DegreesToRadians(90));
[UIView commitAnimations];
您可以将DegreesToRadians定义为
#define DegreesToRadians(x) ((x) * M_PI / 180.0)
答案 1 :(得分:5)
你的第一种方法很好,除了角度是弧度
[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(90/180*M_PI);
[UIView commitAnimations];
答案 2 :(得分:4)
现在大多数人都使用动画块进行iOS动画制作。所以我推荐这样的东西(当然你可以设置你自己的时间和动画选项和旋转度)。享受
[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^{
YOURVIEW.transform = CGAffineTransformMakeRotation(DegreesToRadians(180));
} completion:^(BOOL finished) {
}];
#define DegreesToRadians(x) ((x) * M_PI / 180.0)
如果你正在寻找一个有点棘手的360度转弯,因为它不想动画一个最终正好在它开始的地方的旋转,所以使用这样的东西:
- (void)rotateSpinningView:(UIView *)viewToSpin{
[UIView animateWithDuration:1.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
[viewToSpin setTransform:CGAffineTransformRotate(viewToSpin.transform, M_PI_2)];
} completion:^(BOOL finished) {
if (finished && !CGAffineTransformEqualToTransform(viewToSpin.transform, CGAffineTransformIdentity)) {
[self rotateSpinningView:viewToSpin];
}
}];
}
答案 3 :(得分:2)
我最好的方法是声明C函数
static inline CGFloat degreesToRadians(CGFloat degrees) {return (degrees) * M_PI / 180.0f;}
并使用它
[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:0.5];
self.transform = CGAffineTransformMakeRotation(degreesToRadians(180.0f));
[UIView commitAnimations];