web-dev-qa-db-ja.com

CGAffineTransform Reset

3タッチで操作される画像があります。

上向きの矢印の画像としましょう。 180度回転した後、矢印が下向きになりましたCGAffineTransformプロパティをリセットして、0度に戻っ​​たと考えます。

画像の角度が0 OR 180。

前もって感謝します。

編集後のAter 5の返信:

うーん、これらの答えのいずれかが私が望んでいたことをするかどうかはわかりません。はっきりしないことをおaびします。

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

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

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

37
Gizmodo

変換をリセットして、イメージが元のように表示されるようにする場合は、変換を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;
}
77
Micah Hainline

SwiftSwift 4およびSwift 5

これでCGAffineTransformをリセットできます。

self.imageView.transform = CGAffineTransform.identity

短いバージョンは.identity そのようです:

self.imageView.transform = .identity
38
skymook

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

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

例を参照してください:

// 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;

これは、既存のトランスフォーム値を新しいトランスフォームに加算して適切な動きを実現したい場合のヒントにすぎません。スケールなどに同じ方法を使用します。

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

5
Gurpartap Singh

目的C:

self.transform = CGAffineTransformIdentity;
2
RemembranceNN

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

CGAffineTransform rotation = CGAffineTransformMakeRotation(up ? 0 : M_PI);
imageView.transform = CGAffineTransformScale(rotation,xScale, yScale);
2
Ed Marty