CGAffineTransform Сброс

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

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

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

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

EDITED Ater 5 ответы:

Хм, я не уверен, что какой-либо из этих ответов дает то, что я хотел. Прошу прощения за непонятность.

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

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

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


person Gizmodo    schedule 13.05.2011    source источник


Ответы (5)


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

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;
}
person Micah Hainline    schedule 13.05.2011
comment
Я думаю, что он хочет, чтобы он оставался направленным вниз, но чтобы это было преобразованием идентичности. - person Ed Marty; 13.05.2011

Swift 3, Swift 4 и Swift 5

Вы можете сбросить CGAffineTransform следующим образом:

self.imageView.transform = CGAffineTransform.identity

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

self.imageView.transform = .identity
person skymook    schedule 15.10.2017

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

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

См. Примеры:

// 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. Но не смог заставить это работать.

person Gurpartap Singh    schedule 13.05.2011

Цель C:

self.transform = CGAffineTransformIdentity;
person RemembranceNN    schedule 06.03.2018

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

CGAffineTransform rotation = CGAffineTransformMakeRotation(up ? 0 : M_PI);
imageView.transform = CGAffineTransformScale(rotation,xScale, yScale);
person Ed Marty    schedule 13.05.2011
comment
Ваш комментарий к ответу Мики был правильным. Но и этот ответ не отвечал на вопрос. В настоящее время я сталкиваюсь с похожей потребностью. Есть ли у вас другие предложения? - person user523234; 22.05.2012
comment
Если вы действительно ищете ответ на этот вопрос, вы можете назначить за него вознаграждение. - person Ed Marty; 23.05.2012