CGAffineTransform Reset - PullRequest
       27

CGAffineTransform Reset

35 голосов
/ 13 мая 2011

3У меня есть изображение, которым манипулируют прикосновением.

Допустим, это изображение стрелки, которая указывает вверх.После того, как он повернут на 180 градусов, стрелка направлена ​​вниз, Я хочу сбросить свойства CGAffineTransform , чтобы он теперь думал, что он повернулся обратно к 0 градусам.

Я хочу это, потому что янеобходимо перевести, повернуть, масштабировать и т. д. независимо от того, равен ли угол изображения 0 ИЛИ 180.

Заранее спасибо.

РЕДАКТИРОВАНИЕ После 5 ответов:

Хм, я не уверен, что любой из этих ответов делает то, что я хотел.Я прошу прощения за то, что не был ясным.

  1. Изображение со стрелкой, направленной вверх, касается и перемещается вправо - все в порядке.
  2. Изображение поворачивается жестом вращения и поворачивается на 180 градусов- все в порядке
  3. Теперь изображение коснулось и переместилось вправо - Поскольку координаты перевернуты, теперь изображение подпрыгивает вверх и вниз, что делает мои другие последовательности анимации шумихой.

Чтобы предотвратить вышеуказанную и некоторые другие проблемы, я хочу сбросить все после поворота на 180. Например, когда изображение повернулось на 180 градусов, свойства CGAffineTransform знают, что оно повернуто на 180%.Я хочу сбросить параметры в это время, поэтому CGAffineTransform думает, что он повернул 0 градусов вместо 180, даже если изображение визуально перевернуто.Я хочу, чтобы это происходило без каких-либо визуальных изменений, как только оно повернулось до 180 градусов.

Надеюсь, это станет понятнее ...

Ответы [ 5 ]

76 голосов
/ 13 мая 2011

Если вы пытаетесь сбросить преобразование так, чтобы изображение отображалось так, как оно было изначально, вы можете просто установить преобразование обратно на идентичность.

self.imageView.transform = CGAffineTransformIdentity

Если вы хотите применить произвольные преобразования к преобразованному изображению, проще всего будет использовать методы CGAffineTransform, которые принимают существующее преобразование. Просто отправьте в существующей трансформации. Например:

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

Если вам ДЕЙСТВИТЕЛЬНО нужно изображение, как оно выглядит без каких-либо преобразований, вам придется нарисовать его обратно в другое изображение. Это тоже не сложно, но я не рекомендую это как первое решение. Этот код работает в контексте категории UIView для произвольного представления, включая 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;
}
35 голосов
/ 15 октября 2017

Swift 3 , Swift 4 и Swift 5

Вы можете сбросить CGAffineTransform с помощью этого:

self.imageView.transform = CGAffineTransform.identity

Более короткая версия просто .identity примерно так:

self.imageView.transform = .identity
5 голосов
/ 13 мая 2011

Вчера сделал что-то похожее, но проще.

Найти любое существующее значение преобразования. Затем поместите это как смещение для нового преобразования.

См. Примеры:

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

Это просто подсказка, если вы хотите дополнить существующие значения преобразования новыми преобразованиями, чтобы сделать правильный ход. Используйте те же методы для масштаба и т. Д.

Некоторые предлагали использовать CABasicAnimation с аддитивным свойством, установленным в YES. Но не мог заставить это работать.

2 голосов
/ 06 марта 2018

Цель C:

self.transform = CGAffineTransformIdentity;
2 голосов
/ 13 мая 2011

Вы можете объединить несколько преобразований. Например:

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