CGAffineTransformRotate和M_-PI不一致(目标C,iOS)
我试着在Objective-C中做简单的旋转,一开始就有几个问题。一件事是我从中得到的不一致性,以及在该函数中使用M_PI时是如何不一致的 假设我这样做,并将其连接到一个按钮上。当我按下它一次时,它将逆时针旋转180度(很好,遵循文档),但当我再次按下它时,它将顺时针旋转180度,即使该值不是负值。将M_PI更改为-M_PI执行完全相同的操作,且旋转没有差异:CGAffineTransformRotate和M_-PI不一致(目标C,iOS),ios,objective-c,rotation,cgaffinetransform,Ios,Objective C,Rotation,Cgaffinetransform,我试着在Objective-C中做简单的旋转,一开始就有几个问题。一件事是我从中得到的不一致性,以及在该函数中使用M_PI时是如何不一致的 假设我这样做,并将其连接到一个按钮上。当我按下它一次时,它将逆时针旋转180度(很好,遵循文档),但当我再次按下它时,它将顺时针旋转180度,即使该值不是负值。将M_PI更改为-M_PI执行完全相同的操作,且旋转没有差异: [UIView animateWithDuration:secs delay:0.0 options:option animati
[UIView animateWithDuration:secs delay:0.0 options:option
animations:^{
self.transform = CGAffineTransformRotate(self.transform, M_PI); //Inconsistent
} completion:nil];
现在假设我将M_PI更改为3.141593,这是打印时M_PI包含的值。现在,当我按下按钮时,它完全正常工作。两次,它都会逆时针旋转180度。当我将其更改为-3.141593时,它也将完全正常工作,顺时针:
self.transform = CGAffineTransformRotate(self.transform, 3.141593); //Works
当我玩得越多,行为就越怪异
假设我想旋转90度(pi/2)。M_PI现在具有与使用值相同的行为,但旋转方向与它应该的方向相反:
//Should be Clockwise but rotates CounterClockwise
self.transform = CGAffineTransformRotate(self.transform, -M_PI/2);
self.transform = CGAffineTransformRotate(self.transform, -1.5707965);
//Should be CounterClockwise but rotates Clockwise
self.transform = CGAffineTransformRotate(self.transform, M_PI/2);
self.transform = CGAffineTransformRotate(self.transform, 1.5707965);
如果我想旋转180度以上的物体,行为就是旋转最短的路径,即使我指定了正旋转或负旋转。当我旋转360度(2PI)时,它甚至不旋转
为什么会发生这些事情?我能做些什么使其更加一致?
第二个问题是如何将物体旋转270度和360度。问题是,在使用animateWithDuration时,无法真正控制旋转方向。它总是走最短的路线。当旋转180度时,由于理论上存在两种最短路径的可能性,因此行为尚未确定。这也解释了为什么旋转角度不能超过180度。如果你想对动画有更多的控制,或者做更复杂的动画,请使用CAKeyframeAnimation。正如phix23所说:总是走最短的路线。所以你们可以通过使用这个技巧来避免这种情况,比如顺时针转一整圈:你们必须把这个圈分成3个控制点:
[UIView animateWithDuration:secs delay:0.0 options:UIViewAnimationOptionCurveLinear
animations:^{
self.transform = CGAffineTransformRotate(self.transform, M_PI_2/3);
} completion:(BOOL end)
{
[UIView [UIView animateWithDuration:secs delay:0.0
options:UIViewAnimationOptionCurveLinear
animations:^{
self.transform = CGAffineTransformRotate(self.transform, -M_PI_2/3);
} completion:(BOOL end)
{
}
}
];
此代码未经测试,因此如果有问题,请尝试使用它。希望这会有所帮助。为什么旋转pi/2(90)会将其旋转到3pi/2(270)的相反方向。