4

私は Objective-C で単純な回転を行おうとしていますが、すぐにいくつかの問題があります。1 つのことは、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)しても回転しません。

なぜこれらのことが起こるのか、またそれをより一貫させるために何ができるのか? 2 つ目の質問は、物を 270 度と 360 度回転させるにはどうすればよいかということです。

4

2 に答える 2

11

問題は、animateWithDuration を使用すると回転方向を実際に制御できないことです。常に最短ルートをたどります。180 度回転する場合、理論的には最短経路には 2 つの可能性があるため、動作は未定です。これは、180 度以上回転できない理由も説明しています。アニメーションをより詳細に制御したい場合、またはより複雑なアニメーションを実行したい場合は、CAKeyframeAnimation を使用します。

于 2012-10-08T21:14:21.187 に答える