2012-12-04 16 views
9

मैंने iPhone and iPad apps for Absolute Beginners by Rory Lewis पुस्तक का उपयोग करके उद्देश्य-सी का अध्ययन करना शुरू किया लेकिन मैं 5 वें अध्याय पर अटक गया।CGAffineTransform और छवि के केंद्र में स्केलिंग

मैं एक बटन बनाना चाहता हूं जो छवि को छोटा करता है।
मेरी समस्या यह है कि, मैंने सभी कोड लिखने के बाद, छवि UIImageView (शीर्ष बाएं) के बिंदु (0, 0) तक गिर जाती है, जबकि वीडियो में छवि इसके केंद्र में घूमती है। मैंने कुछ शोध किया है और पाया है कि CGAffineTransform अनुवाद, रोटेशन इत्यादि बनाने के लिए ऑब्जेक्ट के केंद्र का उपयोग करता है

तो यह मेरे मामले में क्यों काम नहीं करता है?

मेरे पास नवीनतम एक्सकोड संस्करण है और मैंने कुछ भी अजीब नहीं किया है। मुझे आशा है कि मैं स्पष्ट हो गया हूं। मेरी अंग्रेजी के लिए खेद है।

EDIT कोड के लिए खेद है, लेकिन मैंने अपने फोन से सवाल लिखा था। वैसे भी दोषी हिस्सा चला जाता है इस

- (IBAction)shrink:(id)sender { 

if(hasShrink == NO){ 
    [shrinkButton setTitle:@"Grow" forState:UIControlStateNormal]; 
} 
else if(hasShrink == YES){ 
    [shrinkButton setTitle:@"Shrink" forState:UIControlStateNormal]; 
} 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:1.0]; 
     myIcon.transform = CGAffineTransformMakeScale(.25, .25); 
     hasShrink = YES; 
     [UIView commitAnimations]; 

कुछ}

सभी एनिमेशन सही ढंग से लिखा जाता है और एप्लिकेशन को काम करता है, यह सिर्फ शीर्ष बाईं ओर सिकुड़ता है। बिंदु को UIImageView के केंद्र में डिफ़ॉल्ट रूप से क्यों सेट नहीं किया जाना चाहिए?

संपादित करें: मुझे पता चला कि यह ऑटोलाउट के कारण एक समस्या थी। अक्षम करने के बाद सब कुछ चिकनी चला गया;)

+2

क्या आप जिस कोड का उपयोग कर रहे हैं उसे पोस्ट कर सकते हैं? –

+0

कोड के साथ संपादित;) – halfblood17

उत्तर

7

आप तो ऑटो-लेआउट द्वारा प्रबंधित मैंगलेड दृश्य को बदल रहे हैं, तो आप कुछ अजीब दुष्प्रभावों का अनुभव कर सकते हैं।See this answer for more details.

जिस समाधान को मैं नियोजित कर रहा हूं वह उस दृश्य को समाहित करना था जिसे मैं बिल्कुल उसी आकार के दूसरे दृश्य में बदलना चाहता था। बाहरी दृश्य में उचित लेआउट बाधाएं थीं, जबकि आंतरिक दृश्य बस इसके कंटेनर में केंद्रित था। CGAffineTransform स्केल को आंतरिक दृश्य में बदलने के लिए अब ठीक से केंद्र लागू होते हैं।

+0

धन्यवाद, इससे मुझे बहुत मदद मिली! – aparesidam

6

कुछ इस तरह का प्रयास करें:

CGAffineTransform t = CGAffineTransformMakeScale(0.5, 0.5); 
CGPoint center = imageView.center; // or any point you want 
[UIView animateWithDuration:0.5 
       animations:^{ 
        imageView.transform = t; 
        imageView.center = center; 
       } 
       completion:^(BOOL finished) { 
        /* do something next */ 
       }]; 

अगली बार अपने कोड दिखाते हैं। आपकी मदद करना आसान होगा।

चेक इस परियोजना: https://github.com/djromero/StackOverflow/archive/Q-13706255.zip

आप का अध्ययन करना चाहिए कि कैसे autolayout और autoresize अपने विचार प्रभावित करते हैं। उपर्युक्त परियोजना में दोनों को यह देखने के लिए अक्षम किया गया है कि यह कैसे काम करता है।

CGAffineTransform कृत्यों (घूमता है, तराजू) एक anchorPoint चारों ओर:

+0

मैंने जैसा कहा है मैंने किया है, लेकिन अगर मैं 'myImage.center.x' और 'myImage.center.y' के मान को मुद्रित करता हूं तो यह बाएं ऊपरी कोने पर इंगित करता रहता है। मैंने प्रोजेक्ट को पुनरारंभ करने के लिए 3 बार कोशिश की है और अभी भी एक ही समस्या है, यहां तक ​​कि सिंक बटन के लिए कोड भी लिखना है। '- (आईबीएक्शन) सिकुड़: (आईडी) प्रेषक { अगर (हैड किया गया == नहीं और& हैशशंक == नहीं) { [UIView प्रारंभएनीमेशन: शून्य संदर्भ: शून्य]; [UIView सेटएनीमेशन अवधि: 1.0]; _myIcon.transform = sizeShrink; हैशशंक = हाँ; [UIView commitएनीमेशन]; ' – halfblood17

+0

यदि आप उस कोड का उपयोग कर रहे हैं तो आप जो भी कहा है वह नहीं कर रहे हैं। कृपया, अपने स्रोत के साथ प्रश्न अपडेट करें, टिप्पणियां न जोड़ें (पढ़ने के लिए कठिन, सही जगह नहीं)। – djromero

+0

ठीक है, मैं इसे ठीक कर दूंगा। लेकिन फिर भी मैंने केवल आपके कोड का उपयोग करने की कोशिश की और कुछ भी नहीं बदला .. यह अभी भी चलते समय आकार बदलता है। – halfblood17

8

पुराना सवाल ... लेकिन सिर्फ मामले में दूसरों की तलाश में आते हैं।

यदि आप 0, 0 का आकार बदल रहे हैं तो आपका एंकर पॉइंट 0, 0 पर सेट हो गया है। यदि आप इसे छवि के केंद्र जैसे किसी भिन्न बिंदु पर आकार देना चाहते हैं, तो आपको एंकर पॉइंट को बदलने की आवश्यकता है। यदि आप एक UIImageViewimageview कहा जाता है

लंगर एक परत

तो का हिस्सा है, तो आप एक फोन करना होगा इस imageView के केंद्र के लिए लंगर स्थापित करने के लिए की तरह:

[imageview.layer setAnchorPoint:CGPointMake(0.5, 0.5)]; 
+3

'एंकरपॉइंट' को सापेक्ष मूल्यों और डिफ़ॉल्ट रूप से '0.5, 0.5' में मापा जाता है, जो दृश्य का केंद्र है। पिक्सेल मानों का उपयोग करने से आपको अपेक्षित परिणाम नहीं मिलेंगे। – devios1

+0

धन्यवाद ... अच्छा बिंदु! – HalR

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