旋转UIView 360度以上

时间:2012-06-02 17:07:56

标签: ios objective-c uiview rotation cgaffinetransform

在最好的时候,我对弧度很困惑,所以当我旋转UIViews时,我倾向于学位。到目前为止,我一直在使用以下公式将度数转换为弧度:

#define radians(x) (M_PI * x / 180.0)

到目前为止一切顺利。当我在屏幕上有一个用户旋转360度以上的UIView时会出现问题,我想在屏幕上显示图像旋转了多少度。我有这个,它可以很好地工作180度:

float rot = [recognizer rotation];
[self.steeringWheel setTransform:CGAffineTransformRotate([self.steeringWheel transform], (rot))]; // turn wheel

CGFloat radians = atan2f(steeringWheel.transform.b, steeringWheel.transform.a); 
CGFloat degrees = radians * (180 / M_PI);

self.degreesBox.text = [NSString stringWithFormat:@"%1.0f", degrees]; // show degrees of rotation on screen

180度后,我的读数变为-179,-178等一直变回零。相反,我希望它继续指望高达359(如果可能的话,然后再回到零,1,2等)。

我可以使用一个增加2到179,3到178等的公式来获得正确的数量,但是当我然后转向相反方向的转向时这将不起作用(-1度转弯将会读出如359,当我真的希望它读出为1或-1时。

我希望这是有道理的。基本上,我想知道车轮从起点向各个方向转动了多少。我现在得到的是通过最短路径读取多少度回到起点。

2 个答案:

答案 0 :(得分:1)

试试这段代码:

CGFloat radians = atan2f(steeringWheel.transform.b, steeringWheel.transform.a); 
if (radians < 0.0) radians += 2 * M_PI;
CGFloat degrees = radians * (180 / M_PI);

编辑:

在重新阅读您的问题后,我看到了您的问题所在。 atan2将始终返回范围(-π,π]中的结果。

看起来你希望自动轮可以向左旋转一个完整的圆圈,向右旋转一个完整的圆柱体。您可以通过将新角度与旧角度进行比较来解决此问题,以便您知道用户是在CW或CCW中旋转滚轮。

当用户将车轮左(CCW)从启动(空闲)位置旋转到相应的管理标志时,您也可以设置一个标志。

答案 1 :(得分:0)

Swift 3
具有嵌套闭包的动画优于动画延迟块。

UIView.animate(withDuration: 0.5, animations: { 
     button.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi)) 
}) { (isAnimationComplete) in

           // Nested Block
            UIView.animate(withDuration: 0.5) { 
               button.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi * 2))
           }    
     }

带延迟和选项的动画:

// Rotation from 0 to 360 degree    
UIView.animate(withDuration:0.5, animations: { () -> Void in
      button.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
})

// Rotation from 180 to 360 degree
UIView.animate(withDuration: 0.5, delay: 0.45, options: .curveEaseIn, animations: { () -> Void in
       button.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi * 2))
}, completion: nil)