2009-07-10 6 views
26

पर लागू करना क्या UIView में एकाधिक रूपांतरित करने में कोई समस्या है और यह संबंधित कैलियर है?कई परिवर्तनों को एक UIView/CALayer

विशेष रूप से, क्या आप सीजीएफ़ाइनट्रांसफॉर्म के साथ CATransform3Ds को "मिश्रण और मैच" कर सकते हैं बिना मुद्दों के चलते?

साथ ही साथ कुछ परिवर्तनों को एक साथ बदलने के दौरान कुछ बदलावों को स्थापित करने में कोई समस्या है?

क्या इसके लिए कोई "नियम" है कि यह कैसे किया जाना चाहिए, या इसके लिए कोई डिज़ाइन पैटर्न?

उत्तर

38

मुझे एहसास है कि यह पूरी तरह से प्रश्न का उत्तर नहीं देता है (या करीब आते हैं), लेकिन यदि आप केवल CGAffineTransforms के साथ काम कर रहे हैं तो आप कई ट्रांसफॉर्म को गठबंधन करने के लिए CGAffineTransformConcat() का उपयोग कर सकते हैं।

यह कुछ ठीक हो जाएगा जब कुछ परिवर्तन एनिमेटेड होते हैं और अन्य नहीं होते हैं, जब तक आप रूपांतरणों को सही तरीके से जोड़ते हैं। मुझे नहीं पता कि यह कैसे काम करता है जब आप लेयर ट्रांसफॉर्म भी कर रहे होते हैं।

+1

'CGAffineTransformConcat' दो रूपांतरण के लिए अच्छी तरह से काम करता है लेकिन एक छोटे से akward है तीन या अधिक के लिए। दो से अधिक करने के लिए [यह उत्तर] देखें (http://stackoverflow.com/questions/30929986/how-to-apply-multiple-transforms-in-swift/30929987#30929987)। – Suragch

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

+0

मैंने ऐसा सोचा, लेकिन ऐसा लगता है कि अनुवाद पहले लागू किया जाना चाहिए। घूर्णन अनुवादित समन्वय प्रणाली के केंद्र के आसपास है, लेकिन यदि आप पहले घूमते हैं तो अनुवाद करें, अनुवाद घुमावदार समन्वय प्रणाली के धुरी के साथ है। – gamozzii

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