44

3触って操作するイメージがあります。

上向きの矢印のイメージとしましょう。180 度回転した後、矢印が下を向いているので、 CGAffineTransform プロパティをリセットして、0 度に戻ったと認識できるようにします。

画像の角度が 0 か 180 かに関係なく、移動、回転、スケーリングなどを行う必要があるため、これが必要です。

前もって感謝します。

編集後 5 人の返信:

うーん、これらの答えのいずれかが私が望んでいたことをするかどうかはわかりません。わかりにくかったことをお詫び申し上げます。

  1. 矢印が上向きの画像をタッチして右に移動すると、すべて問題ありません。
  2. 画像は回転ジェスチャで回転し、180 度回転します - すべて問題ありません
  3. 画像に触れて右に移動 - 座標が上下逆になっているため、画像が上下にジャンプし、他のアニメーション シーケンスがおかしくなりました。

上記の問題やその他の問題を防ぐために、180 度回転した後にすべてをリセットしたいと考えています。その時点でポパティをリセットしたいので、画像が視覚的に上下逆になっているにもかかわらず、CGAffineTransform は 180 度ではなく 0 度になったと認識します。180度に回転したらすぐに、視覚的な変化なしにこれを実現したいと考えています。

これがより明確であることを願っています....

4

5 に答える 5

78

変換をリセットして、イメージが元のように表示されるようにする場合は、変換を ID に戻すだけで済みます。

self.imageView.transform = CGAffineTransformIdentity

変換された画像に任意の変換を適用する場合、最も簡単な方法は、既存の変換を取り込む CGAffineTransform メソッドを使用することです。既存の変換を送信するだけです。例えば:

CGAffineTransform scale = CGAffineTransformMakeScale(zoom, 1);
self.imageView.transform = CGAffineTransformConcat(self.imageView.transform, scale);

まったく変換せずに表示される画像が本当に必要な場合は、別の画像に戻す必要があります。それもそれほど難しいことではありませんが、最初の解決策としてはお勧めしません。このコードは、UIImageView を含む任意のビューの UIView カテゴリのコンテキストで機能します。

- (UIImage *) capture {
    CGRect screenRect = self.frame;
    CGFloat scale = [[UIScreen mainScreen] scale];
    UIGraphicsBeginImageContextWithOptions(screenRect.size, YES, scale);

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[UIColor blackColor] set];
    CGContextFillRect(ctx, screenRect);

    [self.layer renderInContext: ctx];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;
}
于 2011-05-13T18:03:04.557 に答える
5

昨日は似たようなことをしましたが、もっと簡単です。

既存の変換値を見つけます。次に、それを新しい変換へのオフセットとして配置します。

例を参照してください:

// Rotate right/clockwise

CGFloat radians = atan2f(imageView.transform.b, imageView.transform.a);
CGFloat degrees = radians * (180 / M_PI);
// Yeah yeah, I like degrees.
CGAffineTransform transform = CGAffineTransformMakeRotation((90 + degrees) * M_PI/180);
imageView.transform = transform;

// Rotate left/anticlockwise

CGFloat radians = atan2f(imageView.transform.b, imageView.transform.a);
CGFloat degrees = radians * (180 / M_PI);
// Yeah yeah, I like degrees.
CGAffineTransform transform = CGAffineTransformMakeRotation((-90 + degrees) * M_PI/180);
imageView.transform = transform;

これは、既存の変換値を新しい変換に追加して正しい動きを作りたい場合のヒントにすぎません。スケールなどにも同じ方法を使用します。

Additive プロパティを YES に設定して CABasicAnimation を使用することを提案する人もいます。しかし、それを機能させることができませんでした。

于 2011-05-13T18:39:40.493 に答える
2

複数の変換を組み合わせることができます。例えば:

CGAffineTransform rotation = CGAffineTransformMakeRotation(up ? 0 : M_PI);
imageView.transform = CGAffineTransformScale(rotation,xScale, yScale);
于 2011-05-13T18:07:53.027 に答える