在最好的时候,我对弧度很困惑,所以当我旋转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时。
我希望这是有道理的。基本上,我想知道车轮从起点向各个方向转动了多少。我现在得到的是通过最短路径读取多少度回到起点。
答案 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)