2012-06-19 9 views
5

पर CABasicAnimation रोकें मैं CABasicAnimation के साथ बनाई गई रोटेशन एनीमेशन का उपयोग कर रहा हूं। यह 2 सेकंड में UIView घुमाता है। लेकिन UIView को छुआ जाने पर मुझे इसे रोकने में सक्षम होना चाहिए। अगर मैं एनीमेशन को हटा देता हूं तो एनीमेशन शुरू होने से पहले दृश्य उसी स्थिति में होता है।विशिष्ट बिंदु

float duration = 2.0; 
float rotationAngle = rotationDirection * ang * speed * duration; 
//rotationAngle = 3*(2*M_PI);//(double)rotationAngle % (double)(2*M_PI) ; 
CABasicAnimation* rotationAnimation; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: rotationAngle ]; 
rotationAnimation.duration = duration; 
rotationAnimation.cumulative = YES; 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
rotationAnimation.fillMode = kCAFillModeForwards; 
rotationAnimation.delegate = self; 

[self.view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

मैं UIView के रोटेशन सही कहाँ है कैसे रोक सकता है जब इसे छुआ है,:

यहाँ मेरी एनीमेशन कोड है? मुझे पता है कि स्पर्श भाग को कैसे प्रबंधित किया जाए, लेकिन मैं यह नहीं समझ सकता कि एनीमेशन के वर्तमान कोण पर दृश्य को कैसे रोकें।

समाधान: मैं, प्रस्तुति परत के कोण हो रही एनीमेशन को दूर करने और देखने के बदलने की स्थापना करके समस्या हल हो। कोड यह रहा:

[self.view.layer removeAllAnimations];  
CALayer* presentLayer = self.view.layer.presentationLayer; 
float currentAngle = [(NSNumber *)[presentLayer valueForKeyPath:@"transform.rotation.z"] floatValue]; 
self.view.transform = CGAffineTransformMakeRotation(currentAngle); 
+1

जहां ऊपर समाधान रखा है ?? मैं हमेशा कोण प्राप्त कर रहा हूं 0.0000 – Hisenberg

उत्तर

15

अच्छा प्रश्न है! इसके लिए, कोर एनीमेशन आर्किटेक्चर को जानना उपयोगी है।

यदि आप Core Animation Programming Guide में आरेख देखें जो कोर एनीमेशन रेंडरिंग आर्किटेक्चर का वर्णन करता है, तो आप देख सकते हैं कि तीन पेड़ हैं।

आपके पास मॉडल पेड़ है। यही वह जगह है जहां आप होने के मान निर्धारित करते हैं। फिर प्रस्तुति पेड़ है। जहां तक ​​रनटाइम का संबंध है, वैसे ही यह बहुत कुछ हो रहा है। फिर, अंत में पेड़ प्रस्तुत करें। उपयोगकर्ता यही देखता है।

अपने मामले में, आप प्रस्तुति पेड़ के मानों से पूछना चाहते हैं।

ऐसा करना आसान है। इस दृश्य के लिए कि आपने एनीमेशन संलग्न किया है, layer प्राप्त करें और उस layer के लिए, presentationLayer के मानों से पूछें। उदाहरण के लिए:

CATransform3D myTransform = [(CALayer*)[self.view.layer presentationLayer] transform]; 

एनीमेशन मध्य प्रवाह को "रोकें" का कोई तरीका नहीं है। आप जो भी कर सकते हैं वह मानों से पूछताछ करता है, इसे हटा देता है, और उसके बाद इसे फिर से बनाते हैं जहां से आपने छोड़ा था।

यह दर्द का थोड़ा सा है!

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

Restoring animation where it left off when app resumes from background

भी भूल जाते हैं कि जब आप एक दृश्य की परत करने के लिए एक एनीमेशन जोड़ने के लिए, आप वास्तव में अंतर्निहित दृश्य के गुण नहीं बदल रहे हैं मत करो। तो क्या होता है?हम आपको अजीब प्रभाव प्राप्त करेंगे जहां एनीमेशन रुक जाएगा और आप दृश्य को इसकी मूल स्थिति में देखेंगे।

यही वह जगह है जहां आपको CAAnimation प्रतिनिधियों का उपयोग करने की आवश्यकता है। जहां मैं इस कवर इस पोस्ट के लिए मेरा उत्तर पर एक नज़र डालें:

CABasicAnimation rotate returns to original position

+1

प्रस्तुति परत के स्पष्टीकरण के लिए धन्यवाद। मैंने प्रेजेंटेशन के रोटेशन कोण को प्राप्त करके समस्या हल की है। मूल्य के साथ फोरके:, दृश्य के परिवर्तन को सेट करना और एनीमेशन को हटा देना। –

5

आप presentationLayer के रोटेशन के लिए रोटेशन सेट और फिर परत से एनीमेशन दूर करने के लिए की जरूरत है। आप मेरे ब्लॉग पोस्ट में प्रेजेंटेशन लेयर के बारे में Hit testing animating layers के बारे में पढ़ सकते हैं।

अंतिम रोटेशन सेट करने के लिए कुछ करना होगा कोड:

self.view.layer.transform = [(CALayer*)[self.view.layer presentationLayer] transform]; 
[self.view.layer removeAnimationForKey:@"rotationAnimation"];