Applying multiple transforms to a UIView / CALayer

2019-01-14 15:23发布

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?

4条回答
做个烂人
2楼-- · 2019-01-14 15:46

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.

查看更多
不美不萌又怎样
3楼-- · 2019-01-14 15:46

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);
查看更多
闹够了就滚
4楼-- · 2019-01-14 15:51

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)
查看更多
Explosion°爆炸
5楼-- · 2019-01-14 15:55

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];
查看更多
登录 后发表回答