2009-07-10 47 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)