2009-03-22 10 views
8

क्षमा करें अगर यह स्पष्ट है या कहीं और कवर किया गया है, लेकिन मैं पूरे दिन गुगल रहा हूं और वास्तव में कोई समाधान नहीं मिला है जो वास्तव में काम करता है।आईफोन के लिए क्वार्ट्ज 2 डी में रोटेशन ट्रांसफॉर्म करते समय मैं मूल को स्थानांतरित कर सकता हूं?

मेरी समस्या इस प्रकार है: मैं वर्तमान में एक पूर्ण स्क्रीन UIView में एक छवि खींच रहा हूं, उदाहरण के लिए हम कहेंगे कि छवि UIView के निचले दाएं कोने में है। मैं उस छवि के केंद्र में एक रोटेशन ट्रांसफॉर्म (CGAffineTransformMakeRotation) करना चाहता हूं, हालांकि, डिफ़ॉल्ट रूप से रोटेशन कमांड UIView के केंद्र के चारों ओर घूमता है। नतीजतन, मेरी छवि स्क्रीन के चारों ओर घूमती है जब मैं जगह पर रहने और अपने केंद्र के चारों ओर घूमने के बजाए घुमाता हूं।

जो मैंने एकत्र किया है, उससे मुझे अपने संदर्भ का अनुवाद करने की आवश्यकता है ताकि मूल (UIView का केंद्र) मेरी छवि के केंद्र में हो, घुमाएं, और उसके बाद मूल स्थान पर अनुवाद करके संदर्भ को पुनर्स्थापित करें।

निम्नलिखित काम करने के लिए सबसे नज़दीकी चीज है, लेकिन समस्या यह है कि जब छवि घूर्णन हो रही है, तो यह घूर्णन के दौरान नीचे की ओर बढ़ती है। मैं इस Tweening 1 कदम का अनुवाद और 3 कदम बजाय सिर्फ एहसास है कि तब्दील हो पर शुरुआत और अंत बिंदु ही होगा की का अनुवाद एनीमेशन के कारण होता है लगता है ...

// Before this i'd make a call to a function that draws a path to a passed in context 
CGAffineTransform inverseTranslation = CGAffineTransformMakeTranslation(transX, transY); 
CGAffineTransform translation = CGAffineTransformMakeTranslation(-transX, -transY); 
CGAffineTransform rot = CGAffineTransformMakeRotation(3.14); 
CGAffineTransform final = CGAffineTransformConcat(CGAffineTransformConcat(inverseTranslation, rot), translation); 
// Then i apply the transformation animation like normal using self.transform = final etc etc 

मैं भी तरह सामान की कोशिश की है CGContextTranslateCTM और CGContextSaveGState/UIGraphicsPushContext, लेकिन इनका बहुत कम प्रभाव पड़ता है।

मैं इसके साथ दिनों से लड़ रहा हूं और मेरा वर्तमान समाधान करीब लगता है, लेकिन मुझे कोई संकेत नहीं है कि अनुवाद ट्विंगिंग से कैसे छुटकारा पाना है। क्या किसी के पास इसका समाधान है या इसके बारे में जाने का एक बेहतर तरीका है?

[अद्यतन] समय के लिए मैं अपनी छवि को UIview के केंद्र में केंद्रित कर रहा हूं और फिर UIView.center प्रॉपर्टी को मूल में सेट करना चाहता हूं, जिसे मैं घूमना चाहता हूं और फिर घुमावदार आदेश कर रहा हूं। एक हैक की तरह लगता है, लेकिन जब तक मैं असली अनुवाद काम नहीं कर सकता, यह मेरी एकमात्र पसंद है। धन्यवाद!

उत्तर

14

डुनकनविल्कोक्स का जवाब सही है, लेकिन उसने उस हिस्से को छोड़ दिया जहां आप दृश्य की परत के एंकर को उस बिंदु पर बदलते हैं जहां आप घूमना चाहते हैं।

CGSize sz = theview.bounds.size; 
// Anchorpoint coords are between 0.0 and 1.0 
theview.layer.anchorPoint = CGPointMake(rotPoint.x/sz.width, rotPoint.y/sz.height); 
[UIView beginAnimations:@"rotate" context:nil]; 
theview.transform = CGAffineTransformMakeRotation(45./180. * M_PI); 
[UIView commitAnimations]; 

यह यहाँ प्रलेखित है: http://developer.apple.com/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html

+2

त्वरित टिप्पणी- यह दिखाने के लिए संपादित किया गया है कि आपको पीआई मानों के साथ काम करते समय math.h स्थिरांक का उपयोग करना चाहिए। M_PI_4, M_PI_2, M_PI सभी गोल करने वाली त्रुटियों की तुलना में बेहतर और अधिक सटीक हैं :) –

2

घूर्णन दृश्य की परत के एंकरपॉइंट के आसपास होता है। एंकरपॉइंट के लिए डिफ़ॉल्ट केंद्र (0.5, 0.5) है, इसलिए अनुवाद के बिना अकेले घूर्णन पर्याप्त होना चाहिए।

एक त्वरित परीक्षण किया और यह मेरे लिए काम करता है:

[UIView beginAnimations:@"rotate" context:nil]; 
self.transform = CGAffineTransformMakeRotation(45./180. * 3.14); 
[UIView commitAnimations]; 
+0

शायद पसंद मेरा विवरण थोड़ा भ्रामक था। मैं किसी संदर्भ पर कुछ खींच रहा हूं (मैंने इसे एक छवि कहा है, लेकिन यह केवल कुछ संदर्भ है जो मैं संदर्भ कमांड का उपयोग कर खींचता हूं) और यह संदर्भ के cetner पर नहीं है। मैं घूमना चाहता हूं जैसे संदर्भ का केंद्र मेरी "छवि" के केंद्र में था। – Skyler

+0

त्वरित टिप्पणी- यह दिखाने के लिए संपादित किया गया है कि आपको पीआई मानों के साथ काम करते समय math.h स्थिरांक का उपयोग करना चाहिए। M_PI_4, M_PI_2, M_PI सभी गोल करने वाली त्रुटियों की तुलना में बेहतर और अधिक सटीक हैं :) –

1

आप एक एनीमेशन होने के लिये नहीं करना चाहते हैं, लेकिन सिर्फ नए रोटेशन सेट, तो आप इस का उपयोग कर सकते हैं:

CGFloat newRotation = 3.14f 

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.0]; // no tweening 
CGAffineTransform transform = CGAffineTransformMakeRotation(newRotation); 
self.transform = transform; 
[UIView commitAnimations]; 

रोटेशन वास्तव में UIView के केंद्र के आसपास होना चाहिए। एनीमेशन अवधि को शून्य पर सेट करना गारंटी कोई ट्विनिंग नहीं होना चाहिए।

सुनिश्चित करें कि आप यह 60 बार एक सेकंड नहीं करते हैं। इन उपकरणों के साथ एनिमेशन जैसे गेम बनाने के लिए यह बहुत मोहक है। इस तरह के एनिमेशन बिल्कुल फ्रेम के आधार पर फ्रेम के लिए नहीं हैं, "हर जगह उड़ने वाले बहुत सारे sprites" खेल।

इसके लिए - और मैं उस सड़क से नीचे गया हूं - जाने का एकमात्र तरीका ओपनजीएल है।

+0

ठीक है, मैं घुमाने के लिए एनीमेशन चाहता हूं, शायद मैं पूर्व और पोस्ट अनुवादों के लिए अपनी 0 सेकंड अवधि का उपयोग कर सकता हूं क्योंकि CGContextTranslateCTM काम नहीं कर रहा था। .. – Skyler

+0

सुनिश्चित करें कि आप CGContextTranslateCTM करने से पहले CGContext स्थिति को सहेज लें। फिर राज्य को बहाल करें। यदि आपके संदर्भ में ड्राइंग के बाद आप सीटीएम का अनुवाद करते हैं तो इसका कोई (स्पष्ट) प्रभाव नहीं है। – Kriem

7

यह भी एक विकल्प है: आधार ;-)

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); 
transform = CGAffineTransformRotate(transform, angle); 
transform = CGAffineTransformTranslate(transform,-x,-y); 

का एक सरल परिवर्तन जहां (x,y) रोटेशन केंद्र है आप