2009-05-18 4 views
7

मैं एक रोटेशन इस को बदलने के साथ एक एनीमेशन ब्लॉक में एनीमेशन बदलने को लागू करने हूँ:क्या यह पता लगाने का कोई तरीका है कि वर्तमान में एनीमेशन के दौरान कितनी डिग्री एक घूर्णन घूमती है?

CATransform3D rotatedTransform = self.layer.transform; 
rotatedTransform = CATransform3DRotate(rotatedTransform, 90 * M_PI/180.0, 0.0f, 0.0f, 1.0f); 
self.layer.transform = rotatedTransform; 

एनीमेशन शुरू होता है, और एक अन्य घटना में एक नया लक्ष्य की ओर रोटेशन पुश करने के लिए होता है कि में उपयोगकर्ता किक। यथार्थवादी दिखने वाले व्यवहार की गणना करने के लिए, मुझे यह जानने की जरूरत है कि रोटेशन की वर्तमान डिग्री क्या है, ताकि अगली रोटेशन डिग्री उचित रूप से जोड़ दी जा सके।

+1

दूसरा जवाब (टेस लोव द्वारा) इस सवाल का जवाब। आपको इसे स्वीकृत के रूप में चिह्नित करना चाहिए। – MikeyWard

उत्तर

4

आप अपनी प्रस्तुति लेयर को पकड़कर एनिमेटिंग परत की वर्तमान स्थिति पुनर्प्राप्त कर सकते हैं। यह मानते हुए कि आप परत को किसी अन्य परिवर्तनों लागू नहीं किया है, तो आपको निम्न की तरह कोड का उपयोग कर घूर्णन परत की वर्तमान कोण निकाल सकते हैं:

CATransform3D rotationTransform = [(CALayer *)[self.layer presentationLayer] transform]; 
float angle; 
if (rotationTransform.m11 < 0.0f) 
    angle = 180.0f - (asin(rotationTransform.m12) * 180.0f/M_PI); 
else 
    angle = asin(rotationTransform.m12) * 180.0f/M_PI; 

एक अन्यथा असंशोधित में बदलना, M11 और M12 मान हैं निर्देशांक कि यूनिट सर्कल पर झूठ बोलें, ताकि आप वर्णन किए गए कोण को निर्धारित करने के लिए त्रिकोणमिति का उपयोग कर सकें।

EDIT (5/18/2009): कंपाइलर चेतावनियों को दूर करने के लिए कैलायर को एक टाइपकास्ट जोड़ा गया और त्रिकोणमिति संचालन में परिवर्तन के नामकरण को ठीक किया गया।

+0

पहली पंक्ति काम नहीं करती है। संकलक संकलन बंद कर देता है। "अमान्य प्रारंभकर्ता" और "एकाधिक विधियों को नामित किया गया- ट्रांसफॉर्म"। उस अधिकार को कैसे प्राप्त करें, इसके लिए एक और सवाल खुल गया। नेट (searchengine) पर अन्य प्रस्तुति लेयर से मूल्य प्राप्त करने के साथ एक ही समस्या है। – Thanks

+0

मैं कंपाइलर चेतावनियों को दूर करने के लिए कैलायर को टाइपकास्ट जोड़ना भूल गया था। इसके अलावा, मैंने बाद में गणना में रोटेशन ट्रान्सफॉर्म के संदर्भों को सही किया। मैंने इसका परीक्षण किया और यह एक घूर्णन दृश्य के लिए काम करता है। –

+0

मैंने एक एक्शन विधि स्थापित की है जिसे मैंने बटन दबाते समय बुलाया है। फिर मैं 10 सेकंड की अवधि के साथ एनीमेशन को आग लगाना, और 180 डिग्री रोटेशन। दृश्य धीरे-धीरे घूमता है। जैसे ही यह घुमाता है, मैं बटन को क्लिक्सिंग करता रहता हूं। क्रिया विधि कोण प्राप्त करने के लिए कोड निष्पादित करती है, लेकिन जब तक एनीमेशन चल रहा है तब तक कोण 0.0 है। जब यह समाप्त हो गया, और मैं कोण के लिए फिर से पूछता हूं, मुझे लगता है: 180.0 ... किसी कारण से एनीमेशन के दौरान काम नहीं करता है। बस जब यह हो गया। – Thanks

27

यह एक पुरानी सवाल है, लेकिन एक महत्वपूर्ण फ्रेम एनिमेशन के दौरान वर्तमान रोटेशन कोण खोजने की कोशिश कर जब मैं इस जवाब में आए: -

CALayer* layer = [self.layer presentationLayer]; 
float currentAngle = [[layer valueForKeyPath:@"transform.rotation.z"] floatValue]; 

मेरे लिए काम करने के लिए लगता है। इसके अलावा, अच्छा और संक्षिप्त।

+2

बिल्कुल सही। संक्षिप्त। इसे प्रश्न के उत्तर के रूप में स्वीकार किया जाना चाहिए। – MikeyWard

0

आप मैट्रिक्स और त्रिकोणमिति का उपयोग करके इसकी गणना भी कर सकते हैं। इस question

0

के लिए मेरा उत्तर का संदर्भ लें इस प्रयास करें:

CGFloat setAngle = 75.0; 
CATransform3D t = CATransform3DIdentity; 
t.m34 = 0.004; 
t = CATransform3DRotate(t, -M_PI/180*setAngle, 0, 1, 0); 
self.testView.layer.transform = t; 

CGFloat getAngle = 0; 
if (t.m11 < 0.0f) { 
    getAngle = 180.0f - (asin(t.m13) * 180.0f/M_PI); 
} else { 
    getAngle = asin(t.m13) * 180.0f/M_PI; 
} 
NSLog(@"setAngle=%@ getAngle=%@", @(setAngle), @(getAngle));