CGAffineTransform Reset
3 У меня есть изображение, которое управляется прикосновением.
Давайте скажем его изображение стрелки, которая указывает вверх. После того, как он повернут на 180 градусов, стрелка теперь укажет вниз, я хочу reset свойства CGAffineTransform, чтобы он теперь обратил свое внимание на 0 градусов.
Я хочу это, потому что мне нужно перевести, повернуть, масштабировать и т.д., если угол изображения равен 0 или 180.
Спасибо заранее.
EDITED Ater 5 ответов:
Хм, я не уверен, что любой из этих ответов делает то, что я хотел. Прошу прощения за то, что я не понимаю.
- Изображение со стрелкой, направленной вверх, тронуто и перемещено вправо - все в порядке.
- Изображение повернуто с помощью поворота и повернуто на 180 градусов - все в порядке
- Теперь изображение коснулось и перемещено вправо. Поскольку координаты перевернуты, теперь изображение прыгает вверх и вниз, делая мои другие анимационные последовательности непримиримыми.
Чтобы предотвратить проблему выше и некоторые другие, я хочу, чтобы reset все после поворота 180. Например, когда изображение повернуто на 180 градусов, свойства CGAffineTransform знают, что он изменился на 180%. Я хочу использовать reset популяции в то время, поэтому CGAffineTransform думает, что он повернулся на 0 градусов вместо 180, в то время как изображение перевернуто визуально. Я хочу, чтобы это произошло без каких-либо визуальных изменений, вскоре после его поворота на 180 градусов.
Надеюсь, что это яснее....
Ответы
Ответ 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;