2009-07-10 16 views
26

Gibt es ein Problem beim Anwenden mehrerer Transformationen auf eine UIView und den entsprechenden CALayer?Anwenden mehrerer Umwandlungen auf eine UIView/CALayer

Insbesondere können Sie "Mix and Match" CATransform3Ds mit CGAffineTransforms ohne in Probleme zu laufen?

Auch gibt es irgendwelche Probleme mit einigen Transformationen Einstellung direkt, während eine andere Änderung Transformation Animieren gleichzeitig?

Gibt es „Regeln“, wie dies sollte oder irgendwelche Design-Muster für das geschehen?

Antwort

38

Ich weiß, dass dies die Frage nicht vollständig beantwortet (oder nahe kommt), aber wenn Sie nur mit CGAffineTransforms arbeiten, können Sie CGAffineTransformConcat() verwenden, um mehrere Transformationen zu kombinieren.

Dies funktioniert nur gut, wenn einige Transformationen animiert sind und andere nicht, solange man die Transformationen richtig verketten. Ich weiß nicht, wie das funktioniert, wenn Sie auch Layer-Transformationen durchführen.

+1

'CGAffineTransformConcat' funktioniert gut für zwei Transformationen, ist aber ein wenig akward für drei oder mehr. Siehe [diese Antwort] (http://stackoverflow.com/questions/30929986/how-to-apply-multiple-transforms-in-swift/30929987#30929987) für mehr als zwei. – Suragch

31

pix0r ist richtig, aber hier ist ein paar weitere Informationen dazu. The official docs for CGAffineTransformConcat().

Auch hier ist ein kurzes Beispiel:

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

Sollte es nicht CGAffineTransformConcat (rotieren, übersetzen), da die Punkte Zeilenvektoren sind? – Plumenator

+0

Ich dachte das Gleiche, aber es scheint, dass der Übersetzer zuerst angewendet werden sollte. Drehen ist um die Mitte des übersetzten Koordinatensystems. Wenn Sie jedoch zuerst drehen und dann verschieben, erfolgt die Verschiebung entlang der Achse des gedrehten Koordinatensystems. – gamozzii

-1

ich gelinge einen Imageview in der gleichen Zeit zu übersetzen und zu drehen, auf diese Weise:

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

Syntax leicht mit Swift 3 geändert hat. Anpassung der Antwort von @ 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) 
Verwandte Themen