2009-10-27 2 views
0

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

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

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

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

Кедар

ответ

0

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

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

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

I.e. вместо того, чтобы использовать

shape.transform = CGAffineTransformMakeRotation(M_PI); 

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

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

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

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

+0

Вам также могут понравиться функции CGAffineTransformScale (которые позволяют создавать преобразование с использованием существующего преобразования в качестве отправной точки). –

+0

Hi Christopher, Спасибо за ответ. Моя проблема, как я упоминал в оригинальной статье, я пытаюсь перевернуть изображение по вертикали (зеркальное изображение изображения внутри UIImageview). Фрагмент кода, который я опубликовал в исходном сообщении, отлично работает, но он не сохраняет новое (перевернутое) состояние или преобразование UIImageview. Потому что когда-то перевернулось, я хочу делать дальнейшие вращения на этом перевернутом изображении. Скажем, я переворачиваю, а затем поворачиваю, он переворачивает UIImageview с помощью кода выше, и когда я нажимаю «вращать», он поворачивает исходный UIImageview, а не перевернутый. Надеюсь, я тебя не смутил. – 2009-10-29 15:02:32

5

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

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

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

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

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

+0

Hi TechZen, да, он работает таким образом для вращения. Но моя проблема здесь не в ротации. Я пытаюсь перевернуть (зеркальное изображение) UIImageview (см. Код, который я использую для этого в моем исходном сообщении), есть ли способ сделать это преобразование постоянным? Спасибо за вашу помощь. Я ценю это. – 2009-10-29 23:37:35

+0

Когда вы говорите «потому что, когда я пытаюсь перевернуть его в 2 раза», вы имеете в виду применить то же самое преобразование во второй раз? Если это так, мой первоначальный совет все еще стоит. Если нет, то я неправильно понял, что вы пытаетесь сделать, – TechZen

1

У меня с вами такая же проблема, и я нашел решение! Я хочу повернуть 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; 

} 

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

Смежные вопросы