Applying multiple transforms to a UIView / CALayer

2019-01-14 15:38发布

问题:

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?

回答1:

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.



回答2:

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


回答3:

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)


回答4:

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