0

CGAffineTransformMake を使用して UIImageView を垂直方向に反転しています。正常に動作しますが、UIImageview の新しい反転位置を保存していないようです。これは、2 回目に反転しようとすると (以下の行コードを実行)、機能しないためです。

shape.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);

助けてください。

前もって感謝します。

ケダル

4

3 に答える 3

5

ご想像のとおり、変換は自動的に加算/累積されません。変換を割り当てると、ターゲットが 1 回だけ変換されます。

各変換は非常に具体的です。ビューを +45 度回転させる回転変換を適用すると、一度だけ回転することがわかります。同じ変換を再度適用しても、ビューがさらに +45 度回転することはありません。ビューは既に +45 度回転されており、それが変換で行われるすべてであるため、同じ変換をその後すべて適用しても、目に見える効果はありません。

変換を累積的に行うには、既存の変換を単に置き換えるのではなく、新しい変換を既存の変換に適用する必要があります。したがって、使用する後続の各ローテーションについて前述したように:

shape.transform = CGAffineTransformRotate(shape.transform, M_PI);

これにより、新しい変換が既存の変換に追加されます。この方法で +45 度の変換を追加すると、適用されるたびにビューがさらに +45 回転します。

于 2009-10-29T22:49:07.857 に答える
1

私はあなたと同じ問題を抱えており、解決策を見つけました!UIImageViewアニメーションがあるので、を回転させたいです。画像を保存するには、次の方法を使用します。

void CGContextConcatCTM(CGContextRef c, CGAffineTransform transform)

変換パラメータはあなたの変換であるUIImageViewため、imageViewに対して行ったことはすべて画像と同じになります! そして、のカテゴリメソッドを書きましたUIImage

-(UIImage *)imageRotateByTransform:(CGAffineTransform)transform{
// calculate the size of the rotated view's containing box for our drawing space
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
rotatedViewBox.transform = transform;
CGSize rotatedSize = rotatedViewBox.frame.size;
[rotatedViewBox release];

// Create the bitmap context
UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();

// Move the origin to the middle of the image so we will rotate and scale around the center.
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);

//Rotate the image context using tranform
CGContextConcatCTM(bitmap, transform);
// Now, draw the rotated/scaled image into the context
CGContextScaleCTM(bitmap, 1.0, -1.0);
CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;

}

これがあなたを助けることを願っています。

于 2011-11-05T02:06:58.247 に答える
0

以前の変換の効果を元に戻したい場合は、shape.transform プロパティの値を CGAffineTransformIdentity に設定することを検討してください。

ビューの変換プロパティを設定すると、既存の変換が置き換えられます。追加するのではありません。そのため、回転を引き起こす変換を割り当てると、以前に構成したフリップはすべて忘れられます。

以前に変換したビューに追加の回転またはスケーリング操作を追加する場合は、既存の変換を指定できる関数を調査する必要があります。

つまり、使用する代わりに

shape.transform = CGAffineTransformMakeRotation(M_PI);

既存の変換を指定された回転に置き換えます。使用できます

shape.transform = CGAffineTransformRotate(shape.transform, M_PI);

これにより、既存の変換 (それが何であれ) に回転が適用され、それがビューに割り当てられます。CGAffineTransformRotate に関する Apple のドキュメントを参照してください。

ところで、ドキュメントには次のように書かれています。

于 2009-10-27T22:46:48.490 に答える