旋转UIView iPhone

时间:2011-03-28 09:37:38

标签: iphone animation uiview rotation

我正在制作益智游戏,我需要在每次双击时将拼图旋转到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反转为之前的状态。

如何在没有这些问题的情况下用动画旋转拼图?

4 个答案:

答案 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];