2009-07-10 3 views
26

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

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

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

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

ответ

38

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

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

+1

'CGAffineTransformConcat' хорошо работает для двух преобразований, но немного затруднен для трех или более. См. [Этот ответ] (http://stackoverflow.com/questions/30929986/how-to-apply-multiple-transforms-in-swift/30929987#30929987) для выполнения более двух. – Suragch

31

pix0r является правильным, но вот дополнительная информация по этому вопросу. The official docs for 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); 
+2

Не должно быть CGAffineTransformConcat (вращать, переводить), учитывая, что точки являются векторами строк? – Plumenator

+0

Я думал то же самое, но кажется, что перевод должен применяться первым. Поворот вокруг центра переведенной системы координат, но если вы сначала повернете, а затем переведите, то сдвиг будет проходить вдоль оси повернутой системы координат. – gamozzii

-1

мне удалось перевести и повернуть ImageView в то же время, таким образом:

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]; 
1

слегка изменился синтаксис с 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) 
Смежные вопросы