1

在最好的情况下,我对弧度感到很困惑,所以当我旋转 UIView 时,我倾向于以度数工作。到目前为止,我一直在使用以下公式将度数转换为弧度:

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

到现在为止还挺好。当我在屏幕上有一个 UIView 用户正在旋转 360 度或更多时,问题就出现了,我想在屏幕上显示图像旋转了多少度。我有这个,它可以正常工作到 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 时)。

我希望这是有道理的。基本上,我想了解车轮从起点开始在每个方向上转动了多少。我现在得到的是通过最短路线返回起点的度数。

4

2 回答 2

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将始终返回 (−π, π] 范围内的结果。

看起来您希望方向盘能够向左旋转一整圈,向右旋转一整圈。您可以通过将新角度与旧角度进行比较来解决此问题,这样您就可以知道用户是在顺时针还是逆时针旋转车轮。

当用户从起始(空闲)位置向左(CCW)旋转滚轮时,您还可以设置一个标志以相应地管理标志。

于 2012-06-02T17:11:37.770 回答
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)
于 2017-05-26T10:27:19.163 回答