2009-07-19 7 views
9

मैं इस के साथ एक दृश्य के घूर्णन कर रहा हूँ:मैं कोर एनीमेशन में रोटेशन की एक विशिष्ट दिशा (यानी घड़ी की दिशा) कैसे लागू कर सकता हूं?

CGAffineTransform rotatedTransform = CGAffineTransformRotate(CGAffineTransformIdentity, rotationValue); 

मैंने किसी चीज़ जो मैं लगभग 320 डिग्री के लिए चारों ओर स्पिन करना चाहते हैं। अब कोर एनीमेशन चालाक है और इसे जितना आवश्यक हो उतना घुमाता है, इसे -40 डिग्री के साथ घूर्णन करके करता है। तो वस्तु एक छोटी मात्रा में आंदोलन के साथ दूसरी तरफ घूमती है।

मैं इसे घड़ी की दिशा में घूमने के लिए बाध्य करना चाहता हूं। क्या मुझे एनिमेशन को छोटे चरणों में बदलकर करना होगा, या क्या कोई और शानदार तरीका है?

उत्तर

18

निम्न स्निपेट कुंजी-फ़्रेमयुक्त एनीमेशन का उपयोग करके नामक दृश्य को घुमाता है। एनीमेशन में 1 फ्रेम से अधिक 3 फ्रेम फैले हुए हैं, दृश्य क्रमशः पहले, दूसरे और अंतिम फ्रेम में 0º, 180º और 360º तक घूमते हैं। कोड निम्नानुसार है:

CALayer* layer = someView.layer; 
CAKeyframeAnimation* animation; 
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 

animation.duration = 1.0; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

animation.values = [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0.0 * M_PI], 
    [NSNumber numberWithFloat:0.5 * M_PI], 
    [NSNumber numberWithFloat:1.0 * M_PI], nil]; 

animation.keyTimes = [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0.0], 
    [NSNumber numberWithFloat:0.5], 
    [NSNumber numberWithFloat:1.0], nil]; 

animation.timingFunctions = [NSArray arrayWithObjects: 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], nil]; 

[layer addAnimation:animation forKey:@"transform.rotation.z"]; 

यदि आप प्रतिद्वंद्वी एनीमेशन के बाद हैं, तो आपको नकारात्मक मानों का उपयोग करना चाहिए। थोड़ी अधिक बुनियादी एनीमेशन के लिए, आप CABasicAnimation का उपयोग कर सकते हैं:

CALayer* layer = someView.layer; 
CABasicAnimation* animation; 
animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 

animation.fromValue = [NSNumber numberWithFloat:0.0 * M_PI]; 
animation.toValue = [NSNumber numberWithFloat:1.0 * M_PI]; 

animation.duration = 1.0; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

[layer addAnimation:rotationAnimation forKey:@"transform.rotation.z"]; 
+0

क्या मुझे कुछ विशेष शामिल करना है? Xcode सभी केसीए चीजों के बारे में शिकायत करता है जैसे kCAMediaTimingFunctionLinear। वे अज्ञात हैं। – Thanks

+0

".objc_class_name_CAKeyframeAnimation", से संदर्भित: शाब्दिक-सूचक @__ ObjC @__ में TestClass.o ld cls_refs @ CAKeyframeAnimation: प्रतीक (रों) नहीं मिला collect2: ld 1 से बाहर निकलें स्थिति – Thanks

+2

लौटे जब भी आप कुछ नहीं किया जा रहा के साथ समस्या है पाया गया, आपको यह देखने के लिए प्रलेखन में खोजना चाहिए कि यह कहां परिभाषित किया गया है। इस मामले में, उन स्थिरांकों को CAMediaTiming और CAMediaTimingFunction में परिभाषित किया गया है जो क्वार्ट्जकोर फ्रेमवर्क का हिस्सा हैं। यदि आपने क्वार्ट्जकोर.फ्रेमवर्क नहीं जोड़ा है, तो शायद यह आपकी समस्या है। –

1

मेरा मानना ​​है कि आपको इसे एक और "मुख्य फ्रेम" देना होगा यदि आप कोर एनीमेशन को उस दिशा में जाने की इशारा करते हैं।

सुनिश्चित करें और आसान बनाना बंद करें, (कम से कम मध्य चरण की समाप्ति/शुरुआत के लिए) अन्यथा एनीमेशन चिकनी दिखाई नहीं देगा।