Как использовать CGAffineTransformMakeScale и Rotation одновременно?

((UIImageView*)[dsry objectAtIndex:0]).transform = CGAffineTransformMakeRotation(1.57*2);
((UIImageView*)[dsry objectAtIndex:0]).transform = CGAffineTransformMakeScale(.5,.5);

Только одна из этих работ за раз. Как я могу сохранить преобразование, а затем применить другое? Ваше здоровье


person quantumpotato    schedule 13.12.2009    source источник


Ответы (3)


Чтобы расширить то, что сказал Питер, вы могли бы использовать следующий код:

CGAffineTransform newTransform;
newTransform = CGAffineTransformMakeRotation(1.57*2);
((UIImageView*)[dsry objectAtIndex:0]).transform = CGAffineTransformScale(newTransform,.5,.5);

Функции CGAffineTransformMake... создают новые преобразования с нуля, в то время как другие объединяют преобразования. К представлениям и слоям можно применять только одно преобразование за раз, поэтому таким образом вы одновременно создаете несколько эффектов масштабирования, поворота и перемещения для представления.

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

person Brad Larson    schedule 13.12.2009

Из документации Apple:

CGAffineTransformConcat Возвращает матрицу аффинного преобразования, созданную путем объединения двух существующих аффинных преобразований.

CGAffineTransform CGAffineTransformConcat (
   CGAffineTransform t1,
   CGAffineTransform t2
);

Параметры t1 Первое аффинное преобразование.

t2 Второе аффинное преобразование. Это аффинное преобразование присоединяется к первому аффинному преобразованию.

Возвращаемое значение Новая матрица аффинного преобразования. То есть t’ = t1*t2.

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

Обратите внимание, что матричные операции не являются коммутативными — важен порядок, в котором вы объединяете матрицы. То есть результат умножения матрицы t1 на матрицу t2 не обязательно равен результату умножения матрицы t2 на матрицу t1.

person jessecurry    schedule 13.12.2009
comment
Всем спасибо. Я только что удалил CGAFFineTransform, и он отлично работает! - person quantumpotato; 17.12.2009

Только одна из этих работ за раз.

Правильно, потому что вы заменили первое на второе.

Как я могу сохранить преобразование, а затем применить другое?

Объедините их вместе и назначьте результирующую матрицу свойству.

Вы можете хранить матрицу преобразования в переменной типа CGAffineTransform; вы можете использовать это для промежуточных шагов в более сложных преобразованиях или сделать код более понятным (или и то, и другое).

person Peter Hosey    schedule 13.12.2009