Применение нескольких преобразований к UIView/CALayer
Есть ли какая-либо проблема с применением нескольких преобразований к UIView и соответствующего CALayer?
В частности, можете ли вы "смешивать и сопоставлять" CATransform3D с CGAffineTransforms без проблем?
Также есть ли проблемы с настройкой некоторых преобразований непосредственно при одновременном анимации другого преобразования?
Существуют ли какие-либо "правила" для того, как это должно быть сделано, или любые шаблоны проектирования для этого?
Ответы
Ответ 1
Я понимаю, что это не полностью отвечает на вопрос (или приближается), но если вы работаете только с CGAffineTransforms, вы можете использовать CGAffineTransformConcat()
для объединения нескольких преобразований.
Это будет прекрасно работать, когда некоторые преобразования будут анимированы, а другие - нет, если вы правильно выполняете преобразования. Я не знаю, как это работает, когда вы также выполняете преобразования слоев.
Ответ 2
pix0r прав, но вот еще немного информации об этом. Официальные документы для 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);
Ответ 3
Синтаксис слегка изменился с помощью Swift 3. Адаптация ответа @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)
Ответ 4
Мне удалось перевести и повернуть изображение в одно и то же время:
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];