2014-10-05 90 views
1

我使用下面的代码将我的UIView旋转到90度。使用CGAffineTransformMakeRotation旋转UIView

- (IBAction)rotateView:(id)sender { 

    [UIView animateWithDuration:0.2 animations:^{ 
     _myView.transform = CGAffineTransformMakeRotation(M_PI/2); 
    }]; 
} 

如果我打电话rotateView再次行动,_myView不会再转动。任何想法如何解决?我想每次调用rotateView时将_myView旋转90度。

回答

0

将变换添加到myView中时,您不是将变换应用于现有变换状态,而是覆盖变换。这意味着当你第二次设置transform = CGAffineTransformMakeRotation(M_PI/2)时,你根本没有改变转换。

编辑: 正如罗布所指出的,当旋转值已存储在变换中时,不需要使用属性rotationInRadians。相反,你可以简单地修改现有的变换是这样的:

[UIView animateWithDuration:0.2 animations:^{ 
    _myView.transform = CGAffineTransformRotate(_myView.transform, M_PI/2); 
}]; 

下面是一个不理想的解决方案,我以前提出。

您将需要一个跟踪您的旋转的变量。每次旋转时,您将按照您希望的数量递增该变量,然后根据变量的新值创建新的变换。

使属性做到这一点:

@property (nonatomic, assign) CGFloat rotationInRadians; 

它在你的init方法初始化为0。然后修改您的rotateView方法以增加rotationInRadians并应用新的变换。

- (IBAction)rotateView:(id)sender { 
    self.rotationInRadians += M_PI/2; 
    [UIView animateWithDuration:0.2 animations:^{ 
     _myView.transform = CGAffineTransformMakeRotation(self.rotationInRadians); 
    }]; 
} 
+0

惊人!非常感谢。 – 2014-10-05 01:43:06

+0

当视图已经在视图的变换中时,没有理由跟踪单独变量中的旋转。 – 2014-10-05 01:55:19

+0

好点。我看不出将它存储在外部变量中的好处。我会说罗布的答案更简单,更正确。 – dfmuir 2014-10-05 01:58:49

2
[UIView animateWithDuration:0.2 animations:^{ 
    _myView.transform = CGAffineTransformRotate(_myView.transform, M_PI/2); 
}];