web-dev-qa-db-ja.com

CGAffineTransformMakeRotationの回転方向について

CGAffineTransformMakeRotationを使用しようとしていますが、Apple

このマトリックスが座標系の軸を回転させる角度(ラジアン)。 iOSでは、正の値は反時計回りの回転を示し、負の値は時計回りの回転を示します。 OS Xでは、正の値は時計回りの回転を示し、負の値は反時計回りの回転を示します。

したがって、パラメータを90度渡すと、反時計回りに回転するはずです。
self.myViewは灰色の背景色のビューで、赤い正方形のビューは回転方向を確認するためだけのものです

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0)
CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) );
[self.myView setTransform:rotation];

Before RotationAfter Rotation

しかし、なぜそれは時計回りに回転するのですか?
シミュレーターで使用しようとしていますが、デバイスはどちらも同じ結果で、時計回りに回転します
そして、アニメーションを使用するように調整します。

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0)
CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) );
[UIView animateWithDuration:0.5
                 animations:^{
                     self.myView.transform = rotation;
                 }
                 completion:^(BOOL finished) {
                     NSLog(@"%@", NSStringFromCGAffineTransform(self.myView.transform));
                 }];

同じ結果、時計回りの回転があります。

誰かが理由を説明できますか、返信ありがとうございます。

19
tom19830924

これはドキュメントのエラーです。

ここ それらは行列を記述し、変換を行うために使用する方程式を提供します:

enter image description here

計算すると、正の角度の場合、回転が得られます反時計回り when[〜#〜] y [〜# 〜]軸方向は上向きですOS Xおよび時計回り when[〜#〜] y [〜#〜] 軸を下向きにiOSの場合

たとえば、ポイント(5,0)を90度に変換しようとすると、(0,5)が得られます。これは、iOSでは時計回り、OS Xでは反時計回りを意味します。

同じドキュメントには、引用した(誤った)部分がまだあります。

IOSでは、正の値は反時計回りの回転を指定し、負の値は時計回りの回転を指定します。 OS Xでは、正の値は時計回りの回転を指定し、負の値は反時計回りの回転を指定します。

これは明らかに間違ったです。なぜなら、方程式(同じドキュメントの一部であり、かなり 標準の回転方程式 )は反対のことを言っているからです。

15

これは実際には正しい動作であり、ドキュメントには正しく記述されています。

ここでは、2つの異なる座標系を扱っています。 Core Graphicsの座標系の左下には(0、0)がありますが、UIKitの座標系には左上に(0、0)があります。両方の座標系には、左側に0のX軸があります。言い換えると、UIKitの座標系は、垂直方向に反転したCoreGraphics座標系です。次の画像は違いを示しています。

Comparison of UIKit and Core Graphics coordinate systems


さて、あなたの見積もりを見てみましょう:

このマトリックスが座標系の軸を回転させる角度(ラジアン)。 iOSでは、正の値は反時計回りの回転を指定し、負の値は時計回りの回転を指定します。

一見間違っているように見えますが、何かを見逃しています。 CGAffineTransformMakeRotationリファレンス からの引用です。これはCore Graphicsリファレンスの一部であり、UIKitリファレンスではありません。これは、回転を反時計回りに参照していますCore Graphicsの座標系

画面に表示されているものを垂直に反転し、回転がどのように見えるかを想像することで、頭の中でこの回転を想像することができます。

実際、CGAffineTransformMakeRotationリファレンスには ディスカッションアイテム があり、これを文書化しています。

実際の回転方向は、ターゲットプラットフォームの座標系の方向に依存します。これは、iOSとmacOSでは異なります。


CGContextのrotate(by :)メソッドリファレンスのディスカッションアイテム は、この動作を少しよく説明しています。

コンテキストが回転する方向は、この関数を実行する前に、現在の変換行列の状態によって変更されているように見える場合があります。たとえば、iOSでは、UIViewは、Y軸を反転させるグラフィックスコンテキストに変換を適用します(-1で乗算します)。以前に反転した座標系でユーザー座標系を回転すると、反対方向に回転します(つまり、正の値は座標系を時計回りに回転しているように見えます)。

8
Ben Kane

反時計回りに回転させるには..- veでur角度を作成します。例:

*

imageToBeRotated.transform = CGAffineTransformMakeRotation(-angle); // for anti-clockwise rotation
imageToBeRotated.transform = CGAffineTransformMakeRotation(angle); // for clockwise rotation

*

6
Maniac One

画像を別の方向に回転させる簡単なコードがあります。

int Count==1;
- (IBAction)Btn_Image:(id)sender {
if (Count==1) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationRight];
    self.Img_Canvas.image = image;
}
else if (Count == 2) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationDown];
    self.Img_Canvas.image = image;
}
else if (Count == 3) {
    Count = Count + 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationLeft];
    self.Img_Canvas.image = image;
}
else if (Count == 4) {
    Count = 1;
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationUp];
    self.Img_Canvas.image = image;
}}
0

混乱しないでください。 Appleドキュメントでは間違っています。

CGAffineTransformMakeRotation(-angle)//反時計回りの回転用CGAffineTransformMakeRotation(angle)//時計回りの回転用

0
Sridhara Shetty