2012-01-06 15 views
23

सेट करें यदि मैं CGAffineTransform के साथ सही ढंग से स्केलिंग को समझता हूं तो इसके केंद्र में परिवर्तन होता है।CGAffineTransform के साथ स्केल करें और एंकर

विशेष रूप से:

self.frame = CGRectMake(0,0,100,100); 
self.transform = CGAffineTransformMakeScale(2, 2); 
NSLog(@"%f;%f;%f;%f", self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height); 

प्रिंटों:

-50;-50;200;200 

आप कैसे एक CGAffineTransform पैमाने एक विशिष्ट लंगर बिंदु का उपयोग करता है बना सकता हूँ (जैसे कि 0; 0)?

+13

यह अजीब है, मैं, iOS 7 पर हूँ और यह केंद्र से पैमाने पर नहीं है, लेकिन यह से मापता है ऊपरी बाएं ... भले ही मैं एंकरपॉइंट को (0.5, 0.5) सेट करता हूं, यह केंद्र से स्केल नहीं करता है। किसी के पास कोई विचार है? –

+2

@ वानडुट्रान मैंने पाया कि दृश्य की 'परत' पर' CATransform3D' का उपयोग करके सही तरीके से व्यवहार किया जाता है और 'एंकरपॉइंट' का पालन करता है। कोशिश करें कि 'CGAffineTransformMakeScale' का उपयोग करने के बजाय, जो किसी भी तरह से विंडो शीर्ष और बाएं सीमाओं को दृश्य को बाधित करता है। –

+0

@ जोनाथनलिन मैं कैटरन्सफॉर्म 3 डी के साथ परत का उपयोग करता हूं जो आईओएस 7 – ZYiOS

उत्तर

57

(ए)

स्केल और फिर अनुवाद करें?

कुछ की तरह:

CGAffineTransform t = CGAffineTransformMakeScale(2, 2); 
t = CGAffineTransformTranslate(t, width/2, height/2); 
self.transform = t; 

(ख)

लंगर बिंदु सेट (जो शायद है क्या आप वास्तव में चाहते हैं)

[self layer].anchorPoint = CGPointMake(0.0f, 0.0f); 
self.transform = CGAffineTransformMakeScale(2, 2); 

(ग)

सेट यह सुनिश्चित करने के लिए फिर से केंद्र एक ही स्थान पर है?

CGPoint center = self.center; 
self.transform = CGAffineTransformMakeScale(2, 2); 
self.center = center; 
+0

पर कोई भाग्य नहीं है विधि (ए) 50 के पैमाने के साथ 50; 50; 200; 200 के पैमाने के साथ 200। परीक्षण विधि (बी) जल्द ही, लेकिन इससे प्रभावित नहीं होगा बदल देती है? साइड इफेक्ट्स का कारण हो सकता है। – hpique

+0

ऐसा इसलिए है क्योंकि पहला पैमाने परिवर्तन दूसरे को प्रभावित करेगा। आपके द्वारा लागू आदेश में परिवर्तनों को बदलता है;) और यदि यह केवल एक अनुवाद है तो आप ऐसा करने का प्रयास कर रहे हैं, तो मैंने फ्रेम/सीमा/केंद्र को नई स्थिति में सेट नहीं किया है? – deanWombourne

+0

दिलचस्प बात यह है कि विधि (ए) प्रिंट 0; 0; 300; 300 3 और -50 के पैमाने के साथ; -50; 400; 400 के पैमाने के साथ 4. शायद कुछ गायब है? – hpique

2

सबसे पहले <QuartzCore/QuartzCore.h> #import और फिर अपने को देखने के लिए एंकर बिंदुओं को सेट करें:

[[self layer] setAnchorPoint:CGPointMake(0, 0)]; 
+1

इससे सभी परिवर्तनों के लिए एंकर पॉइंट बदल जाएगा। मैं एक विशिष्ट एंकर पॉइंट के साथ स्केल ट्रांसफॉर्म बनाना चाहता हूं। – hpique

+0

CGAffineTransform tr = CGAffineTransformScale (self.transform, 2, 2); self.transform = tr; self.center = CGPointMake (0,0); –

संबंधित मुद्दे