43
votes

3I have an image that gets manipulated by touch.

Lets say its an image of an arrow that points up. After it's been rotated 180 degrees, so the arrow is pointing down now, I want to reset CGAffineTransform properties so that it thinks now its turned back to 0 degrees.

I want this because I have to translate, rotate, scale etc whether the image's angle is 0 OR 180.

Thanks in advance.

EDITED Ater 5 replies:

Hmm, I am not sure if any of these answers do what I wanted to. I apologize for not being clear.

  1. An Image with the arrow pointing up is touched and moved to right - everything is fine.
  2. Image is rotated with the rotation gesture and turned 180deg - everything is fine
  3. Image is now touched and moved to right - Since the coordinates are upside down, now the image is jumping up and down making my other animation sequences go screwy.

To prevent above problem and some other ones, I want to reset everything after it has been rotated 180. For example once the image turned 180deg, CGAffineTransform properties knows it's turned 180%. I want to reset the poperties at that time so CGAffineTransform thinks its turned 0 degrees instead of 180, eventhough the image is upside down visually. I want this to happen without any visual changes, soon as its rotated to 180deg.

Hope this is clearer....

5

5 Answers

78
votes

If you are trying to reset the transformation, so that the image appears as it did originally, you can simply set the transform back to the identity.

self.imageView.transform = CGAffineTransformIdentity

If you want to apply arbitrary transformations to the transformed image, the easiest thing to do would be to use the CGAffineTransform methods that take in an existing transformation. Just send in the existing transformation. For example:

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

If you REALLY need the image as it appears without any transformation at all, you'll have to draw it back into another image. That's not that hard either, but I don't recommend it as your first solution. This code works in the context of a UIView category for an arbitrary view, including a UIImageView:

- (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;
}
52
votes

Swift 3, Swift 4 and Swift 5

You can reset a CGAffineTransform with this:

self.imageView.transform = CGAffineTransform.identity

The shorter version is just .identity like so:

self.imageView.transform = .identity
5
votes

Did something similar but simpler yesterday.

Find any existing transform value. Then, put that as an offset to the new transform.

See examples:

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

This is just a hint if you want to live with adding up existing transform values to new transforms to make up the right move. Use same methods for scale, etc.

Some suggested to use CABasicAnimation with additive property set to YES. But couldn't get that to work.

4
votes

Objective C:

self.transform = CGAffineTransformIdentity;
2
votes

You can combine multiple transformations. For example:

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