20

私は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];

回転前 回転後

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

#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));
                 }];

同じ結果、時計回りの回転になります。

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

4

5 に答える 5

8

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

ここでは、2 つの異なる座標系を扱っています。Core Graphics の座標系は左下が (0, 0) ですが、UIKit の座標系は左上が (0, 0) です。どちらの座標系にも、左側が 0 の X 軸があります。つまり、UIKit の座標系は、コア グラフィックスの座標系を上下反転したものです。次の図は、違いを示しています。

UIKit と Core Graphics 座標系の比較


それでは、あなたの引用を見てみましょう:

この行列が座標系の軸を回転させる角度 (ラジアン単位)。iOS では、正の値は反時計回りの回転を指定し、負の値は時計回りの回転を指定します。

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

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

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

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


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

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

于 2016-12-13T17:08:16.843 に答える
7

反時計回りの回転を取得するには.. -ve で角度を付けます。例:

*

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

*

于 2013-11-08T12:54:53.567 に答える
0

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

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;
}}
于 2017-10-27T09:51:03.740 に答える