2009-07-10 60 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 2015-06-19 04:52:19

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 2011-08-01 07:11:17

-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

语法已与斯威夫特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)