Corey Floyd
Corey Floyd

Reputation: 25969

Applying multiple transforms to a UIView / CALayer

Is there any problem applying multiple transforms to a UIView and it's corresponding CALayer?

Specifically, can you "mix and match" CATransform3Ds with CGAffineTransforms without running into issues?

Also are there any problems with setting some transforms directly while animating another transform change simultaneously?

Are there any "rules" for how this should be done, or any design patterns for this?

Upvotes: 33

Views: 22361

Answers (4)

Justin Vallely
Justin Vallely

Reputation: 6089

Syntax has changed slightly with Swift 3 & 4. Adaptation of @whitehawk's answer:

// 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)

Upvotes: 12

user2753894
user2753894

Reputation: 1

I succeed to translate and rotate an imageView in the same time, this way:

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

Upvotes: -1

whitehawk
whitehawk

Reputation: 2425

pix0r is right but here is some more info on this. The official docs for CGAffineTransformConcat().

Also, here is a quick example:

// 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);

Upvotes: 37

pix0r
pix0r

Reputation: 31290

I realize this doesn't answer the question entirely (or come close), but if you're only working with CGAffineTransforms you can use CGAffineTransformConcat() to combine multiple transforms.

This will work just fine when some transforms are animated and others are not, as long as you concat the transformations properly. I don't know how this works when you're also doing layer transforms.

Upvotes: 46

Related Questions