2009-06-23 22 views
14

मैं एक बहुत ही सरल कीफ्रेम एनीमेशन बनाने की कोशिश कर रहा हूं, जिससे एक ग्राफिक एक कोण से दूसरे कोण तक घूमता है, किसी दिए गए मिडपॉइंट के माध्यम से।बेसिक कीफ्रेम एनीमेशन (रोटेशन)

(उद्देश्य बल्कि एनीमेशन 'धोखा' और सबसे छोटा मार्ग, यानी जाना की तुलना में एक कुंठित चाप 180 डिग्री, इससे बड़ा के कोण के माध्यम से रोटेशन चेतन करने के लिए सक्षम होने के लिए,, तीव्र है विपरीत के माध्यम से छोटे कोण -। जो जब केवल एक [यानी, गंतव्य]-फ़्रेम भी हो सकता है चारों ओर 'लंबी' रास्ता तय करने के लिए, मुझे लगता है मैं के माध्यम से एक अतिरिक्त मुख्य-फ़्रेम रास्ते के मध्य में की जरूरत है, साथ वांछित चाप मान)

यहाँ है। जो अब तक मिला है (जो सबसे तीव्र कोण के माध्यम से वांछित रोटेशन के लिए ग्राफ़िक प्राप्त करता है):

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__)/180.0 * M_PI) 

... 

[UIView beginAnimations:nil context:nil]; 
CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(desiredEndingAngle)); 
[UIView setAnimationDuration:0.5]; 
graphic.transform = cgCTM; 
[UIView commitAnimations]; 

के रूप में मैं इसे समझते हैं, मैं नहीं एक मार्ग के किनारे एनीमेशन के लिए (न कि रोटेशन से के बाद से है कि अनुवाद के लिए है,) वैसे भी देख रहा हूँ ...

, किसी भी मदद की बहुत सराहना की जाएगी! अग्रिम में धन्यवाद।

+0

एक त्वरित स्पष्टीकरण (क्योंकि यह थोड़ी देर के बाद से मैंने ज्यामिति लिया है!)। इसका उद्देश्य एक स्पीडऑमेटर-टाइप गेज पर सुई को घुमाने के लिए है, जिसका चिह्न 180 से अधिक डिग्री कवर करता है। जैसा कि अब है, जब सुई अधिकतम 0 से मैक्स के पास जाती है, तो वहां पहुंचने के लिए सबसे छोटी दूरी होती है ... इस प्रकार, "6 बजे" क्षेत्र के माध्यम से पार किया जाता है, जहां कोई निशान नहीं होता है (उदाहरण के लिए, जहां यह इसके बजाय "एमपीएच" कहते हैं)। मुझे एक रास्ता चाहिए, अनिवार्य रूप से, निर्दिष्ट करें कि घुमाव क्या होता है। संभवतः, इसका अर्थ क्लॉकवाइज/काउंटरक्लॉक वार, या निर्दिष्ट मिडपॉइंट के माध्यम से है। इसलिए, एक अतिरिक्त कीफ्रेम का विचार। धन्यवाद! –

उत्तर

18

सोचो मुझे मिल गया।

यहाँ कोड है जो (इस उदाहरण में) करता है एक पूर्ण 270 डिग्री रोटेशन (1.5 * pi रेडियंस), विभिन्न मापदंडों सहित आगे अनुकूलित किया जा सकता है कि:

CALayer *layer = rotatingImage.layer; 
CAKeyframeAnimation *animation; 
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.duration = 0.5f; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.values = [NSArray arrayWithObjects:  // i.e., Rotation values for the 3 keyframes, in RADIANS 
     [NSNumber numberWithFloat:0.0 * M_PI], 
     [NSNumber numberWithFloat:0.75 * M_PI], 
     [NSNumber numberWithFloat:1.5 * M_PI], nil]; 
animation.keyTimes = [NSArray arrayWithObjects:  // Relative timing values for the 3 keyframes 
     [NSNumber numberWithFloat:0], 
     [NSNumber numberWithFloat:.5], 
     [NSNumber numberWithFloat:1.0], nil]; 
animation.timingFunctions = [NSArray arrayWithObjects: 
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn], // from keyframe 1 to keyframe 2 
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], nil]; // from keyframe 2 to keyframe 3 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

[layer addAnimation:animation forKey:nil]; 

धन्यवाद!

+0

यह [360 डिग्री से घूर्णन] के लिए काम करता है (http://stackoverflow.com/a/1216951/1309352)। –

1

इस प्रयास करें:

UIImageView* rotatingImage = [[UIImageView alloc] init]]; 
[rotatingImage setImage:[UIImage imageNamed:@"someImage.png"]]; 

CATransform3D rotationTransform = CATransform3DMakeRotation(1.0f * M_PI, 0, 0, 1.0); 
CABasicAnimation* rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 

rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform]; 
rotationAnimation.duration = 0.25f; 
rotationAnimation.cumulative = YES; 
rotationAnimation.repeatCount = 1; 

[rotatingImage.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
+0

हाय, नाथन! प्रतिक्रिया और आपकी विशेषज्ञता के लिए बहुत बहुत धन्यवाद। मुझे अंतिम पंक्ति पर निम्न त्रुटि मिल रही है: "किसी सदस्य या परत के लिए सदस्य 'परत के लिए अनुरोध"। मुझे कल्पना है कि मुझे कुछ और सेटअप याद आ रहा है (जैसा कि यूआईएममेज में आमतौर पर लेयर प्रॉपर्टी नहीं होती है)। कोर एनीमेशन के लिए नया ब्रांड होने के नाते, मैं अभी भी थोड़ा फंस गया हूं। [यह भी सुनिश्चित नहीं है कि यह कैसे मध्यस्थता, या वैकल्पिक रूप से, घूर्णन के लिए एक दिशा (अनिवार्य रूप से घड़ी की दिशा या काउंटरक्लॉक की पसंद) निर्दिष्ट करता है, लेकिन मुझे यकीन है कि इसे चलाने के बाद यह स्पष्ट हो जाएगा।] कई किसी भी मदद के लिए आप सभी को धन्यवाद! –

+0

मैंने कोड नमूना तय किया - मैं UIImageView के बजाय UIImage में एनीमेशन जोड़ रहा था जिसमें UIImage शामिल है, जो स्पष्ट कारणों से काम नहीं करेगा :-) –

+0

धन्यवाद, नाथन, यह समझ में आता है और यह अब संकलित करता है। जैसा कि मैं कह सकता हूं, दुर्भाग्यवश, मैं मोटे तौर पर वापस आ रहा हूं जहां मैंने शुरू किया: एक दिशा में 270 डिग्री (1.5 * पाई रेडियंस) का घूर्णन करने की कोशिश कर रहा है ... परिणाम * 90 डिग्री * विपरीत दिशा में घूर्णन (यानी, लघु रास्ता 'दौर)! मेरा मानना ​​है कि जवाब CABasicAnimation की बजाय CAKeyframeAnimation के साथ है, क्योंकि यह वास्तविक आंदोलन पर अधिक नियंत्रण देता है। मैं इसके साथ खेल रहा हूं, और एक अलग पोस्ट के साथ आने वाले किसी भी उत्तर को पोस्ट करूंगा, या कोई और प्रश्न पोस्ट करूंगा। अपना समय देने के लिए धन्यवाद! –

1
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, 100, 100); 
CGPathAddQuadCurveToPoint(path, NULL, 100, 100, 100, 615); 
CGPathAddQuadCurveToPoint(path, NULL, 100, 615, 900, 615); 
CGPathAddQuadCurveToPoint(path, NULL, 900, 615, 900, 100); 
CGPathAddQuadCurveToPoint(path, NULL, 900, 100, 100, 80); 
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
pathAnimation.path = path; 
pathAnimation.duration = 10.0; 
[someLayer addAnimation:pathAnimation forKey:nil]; 
संबंधित मुद्दे