Вопрос по uikit, core-animation, cocoa-touch, iphone – Применение нескольких преобразований к UIView / CALayer

30

Есть ли проблема с применением нескольких преобразований к UIView и соответствующему CALayer?

В частности, можете ли вы «смешивать и сопоставлять»? CATransform3Ds с CGAffineTransforms без проблем?

Также есть ли проблемы с установкой некоторых преобразований напрямую при одновременной анимации другого преобразования?

Существуют ли какие-либо "правила"? для того, как это должно быть сделано, или какие-либо шаблоны проектирования для этого?

Ваш Ответ

4   ответа
43

что это не отвечает на вопрос полностью (или близко), но если вы работаете только с CGAffineTransforms, вы можете использоватьCGAffineTransformConcat() объединить несколько преобразований.

Это будет прекрасно работать, когда некоторые преобразования анимированы, а другие нет, если вы правильно их преобразовали. Я не знаю, как это работает, когда вы также выполняете преобразования слоев.

CGAffineTransformConcat хорошо работает для двух преобразований, но немного неудобно для трех и более. Увидетьthis answer для выполнения более двух.
35

Официальные документы для CGAffineTransformConcat ().

Кроме того, вот быстрый пример:

// Rotate 45 degrees
CGAffineTransform rotate = CGAffineTransformMakeRotation(45*(M_PI/180));
// Move to the left
CGAffineTransform translate = CGAffineTransformMakeTranslation(-50,0);
// Apply them to a view
self.view.transform = CGAffineTransformConcat(translate, rotate);
Я думал то же самое, но, кажется, перевод должен быть применен в первую очередь. Поворот находится вокруг центра переведенной системы координат, но если сначала повернуть, а затем выполнить преобразование, преобразование выполняется вдоль оси повернутой системы координат.
Не должно ли это быть CGAffineTransformConcat (rotate, translate), учитывая, что точки являются векторами строк?
-1

таким образом:

float scaleFactor_x   = 2.8;
float scaleFactor_y   = 2.45;
imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100);
CGAffineTransform scaleTrans  = CGAffineTransformMakeScale(scaleFactor_x, scaleFactor_y);
CGAffineTransform translateTrans  = CGAffineTransformMakeTranslation(0, 55);
imgBigBallBasic.contentMode = UIViewContentModeScaleAspectFit;
imgBigBallBasic.transform = CGAffineTransformConcat(translateTrans, scaleTrans);
imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100);
imgBigBallBasic.center = [[imgBigBallBasic window] center];
[UIView commitAnimations];
6

4. Адаптация ответа @ whitehawk:

// Rotate 45 degrees
var rotate = CGAffineTransform(rotationAngle: 45 * (.pi / 180))
// Move to the left
var translate = CGAffineTransform(translationX: -50, y: 0)
// Apply them to a view
self.view.transform = translate.concatenating(rotate)
Спасибо за совет!

Похожие вопросы