CGAffineTransformMake - как сохранить состояние UIimageview для дальнейшей обработки - PullRequest
0 голосов
/ 27 октября 2009

Я использую CGAffineTransformMake, чтобы перевернуть UIImageView по вертикали. Он работает нормально, но, похоже, не сохраняет новую перевернутую позицию UIImageview, потому что, когда я пытаюсь перевернуть его 2 раза (выполнить строковый код ниже), он просто не работает.

shape.transform = CGAffineTransformMake (1, 0, 0, 1, 0, 0);

помогите пожалуйста.

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

Кедар

Ответы [ 3 ]

5 голосов
/ 30 октября 2009

Преобразования не являются автоматически аддитивными / накопительными, как вы ожидаете. Назначение преобразования просто преобразует цель один раз.

Каждое преобразование очень специфично. Если применить преобразование вращения, которое поворачивает представление на +45 градусов, вы увидите, что оно вращается только один раз. Повторное применение того же преобразования не приводит к повороту вида на дополнительные +45 градусов. Все последующие применения тех же преобразований не дают видимого эффекта, потому что представление уже повернуто на +45 градусов, и это все, что когда-либо сделает преобразование.

Чтобы преобразование было накопительным, вы должны применить новое преобразование к существующему преобразованию, а не просто заменить его. Так как упоминалось ранее для каждого последующего вращения вы используете:

shape.transform = CGAffineTransformRotate(shape.transform, M_PI);

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

1 голос
/ 05 ноября 2011

У меня такая же проблема с вами, и я нашел решение! Я хочу повернуть UIImageView, потому что у меня будет анимация. Для сохранения изображения я использую этот метод:

void CGContextConcatCTM(CGContextRef c, CGAffineTransform transform)

параметр преобразования является преобразованием вашего UIImageView, поэтому все, что вы сделали с imageView, будет таким же, как с изображением! И я должен написать метод категории UIImage.

-(UIImage *)imageRotateByTransform:(CGAffineTransform)transform{
// calculate the size of the rotated view's containing box for our drawing space
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
rotatedViewBox.transform = transform;
CGSize rotatedSize = rotatedViewBox.frame.size;
[rotatedViewBox release];

// Create the bitmap context
UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();

// Move the origin to the middle of the image so we will rotate and scale around the center.
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);

//Rotate the image context using tranform
CGContextConcatCTM(bitmap, transform);
// Now, draw the rotated/scaled image into the context
CGContextScaleCTM(bitmap, 1.0, -1.0);
CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;

}

Надеюсь, это поможет вам.

0 голосов
/ 28 октября 2009

Если вы просто хотите обратить вспять эффекты предыдущего преобразования, вам может потребоваться установить для свойства shape.transform значение CGAffineTransformIdentity.

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

Если вы хотите добавить дополнительную операцию поворота или масштабирования к ранее преобразованному виду, вам следует изучить функции, позволяющие указать существующее преобразование.

т.е. вместо использования

shape.transform = CGAffineTransformMakeRotation(M_PI);

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

shape.transform = CGAffineTransformRotate(shape.transform, M_PI);

это применяет вращение к существующему преобразованию (что бы это ни было) и затем назначает его представлению. Взгляните на документацию Apple по CGAffineTransformRotate , она может немного прояснить ситуацию.

Кстати, в документации сказано: «Если вы не планируете повторно использовать аффинное преобразование, вы можете использовать CGContextScaleCTM, CGContextRotateCTM, CGContextTranslateCTM или CGContextConcatCTM.»

...