我正在尝试在Objective-C中进行简单的旋转,并且有一些问题。有一点是我从CGAffineTransformRotate得到的不一致以及在该函数中使用时M_PI如何不一致。
假设我这样做,并将其附加到按钮上。当我按下它一次它将逆时针旋转180度(好并遵循文档)但当我再次按它时,它将顺时针旋转180 ,即使该值不是负数。将M_PI更改为-M_PI完全相同,旋转没有差异:
[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度(PI)的任何东西,即使我指定正旋转或负旋转,行为也只是旋转最短路线。当我旋转360度(2PI)时,它甚至不会旋转。
为什么会发生这些事情,我该怎么做才能让它更加一致? 我的第二个问题是如何旋转270度和360度。
答案 0 :(得分:11)
问题是使用animateWithDuration时无法真正控制旋转方向。它总是采用最短的路线。当旋转180度时,行为是不确定的,因为理论上最短路线有两种可能性。这也解释了为什么你不能旋转180度以上。如果您想要更好地控制动画或执行更复杂的动画,请使用CAKeyframeAnimation。
答案 1 :(得分:0)
正如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)
{
}
}
];
此代码未经过测试,因此如果出现问题,请尝试使用它。希望这会有所帮助。