Подтвердить что ты не робот

CGAffineTransform Reset

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

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

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

Спасибо заранее.

EDITED Ater 5 ответов:

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Свифт 3, Свифт 4 и Свифт 5

Вы можете сбросить CGAffineTransform с этим:

self.imageView.transform = CGAffineTransform.identity

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

self.imageView.transform = .identity

Ответ 3

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

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

См. примеры:

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

Ответ 4

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

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

Ответ 5

Цель C:

self.transform = CGAffineTransformIdentity;