2010-01-22 11 views
8

नहीं चलाता है मेरे पास दो एनिमेशन हैं जिन्हें मैं आईएस 3.19 के साथ आईफोन पर यूआईएलएबल पर प्रदर्शन करने की कोशिश कर रहा हूं। पहले UILabel आगे पीछे रॉक्स:CAAnimationGroup के साथ दो कोर एनीमेशन समूहित करने से एक CABasicAnimation

CAKeyframeAnimation *rock; 
rock = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 
[rock setBeginTime:0.0f]; 
[rock setDuration:5.0]; 
[rock setRepeatCount:10000]; 

NSMutableArray *values = [NSMutableArray array]; 
MovingMath *math = [[MovingMath alloc] init]; 

// Center start position 
[values addObject:[math DegreesToNumber:0]]; 

// Turn right 
[values addObject:[math DegreesToNumber:-10]]; 

// Turn left 
[values addObject:[math DegreesToNumber:10]]; 

// Re-center 
[values addObject:[math DegreesToNumber:0]]; 

// Set the values for the animation 
[rock setValues:values]; 

[math release]; 

दूसरा ज़ूम UILabel इतना है कि यह बड़ा हो जाता है:

NSValue *value = nil; 
CABasicAnimation *animation = nil; 
CATransform3D transform; 
animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
transform = CATransform3DMakeScale(3.5f, 3.5f, 1.0f); 
value = [NSValue valueWithCATransform3D:transform]; 
[animation setToValue:value]; 
transform = CATransform3DMakeScale(1.0f, 1.0f, 1.0f); 
value = [NSValue valueWithCATransform3D:transform]; 
[animation setFromValue:value]; 
[animation setAutoreverses:YES]; 
[animation setDuration:30.0f]; 
[animation setRepeatCount:10000]; 
[animation setBeginTime:0.0f]; 

जोड़ा जा रहा है या तो सीधे UILabel की परत करने के लिए इन एनिमेशन में से एक की उम्मीद काम करता है के रूप में।

हालांकि, अगर मैं एनिमेशन एक साथ समूह की कोशिश करते हैं, पहले "कमाल" एनीमेशन काम नहीं करेगी:

CAAnimationGroup *theGroup = [CAAnimationGroup animation]; 

theGroup.duration = 5.0; 
theGroup.repeatCount = 10000; 
theGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
theGroup.animations = [NSArray arrayWithObjects:[self rockAnimation], [self zoomAnimation], nil]; // you can add more 

// Add the animation group to the layer 
[[self layer] addAnimation:theGroup forKey:@"zoomAndRotate"]; 

समूह के लिए एनिमेशन जोड़ने का आदेश कोई फर्क नहीं पड़ता। ज़ूम करने के बजाय, ऊपर की तरह, मैंने सीमाओं को बदलने की कोशिश की, लेकिन यह भी असफल रहा। किसी भी जानकारी की काफी सराहना की जाएगी। धन्यवाद।

+0

नीचे मेरी टिप्पणी नोट करने के लिए ... मैं चाहता हूं कि ये एनिमेशन एक ही समय में हों। समस्या यह है कि समूह का उपयोग करते समय, rockAnimation नहीं चलता है; केवल ज़ूमएनीमेशन चलता है। – Christian

उत्तर

8

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

ऐसा प्रतीत होता है कि आप दोनों परतों के लिए सहायक कुंजीपैथ का उपयोग कर अपनी परत के स्केलिंग और रोटेशन दोनों का कारण बन सकते हैं। आप स्केलिंग एनीमेशन पर अपने कोड को बदलते हैं

CABasicAnimation *animation = nil; 
animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
[animation setToValue:[NSNumber numberWithDouble:3.5]]; 
[animation setFromValue:[NSNumber numberWithDouble:1.0]]; 
[animation setAutoreverses:YES]; 
[animation setDuration:30.0f]; 
[animation setRepeatCount:10000]; 
[animation setBeginTime:0.0f]; 

को पढ़ने के लिए आप दोनों कमाल और अपने स्तर पर स्केलिंग के लिए सक्षम होना चाहिए।

+0

धन्यवाद, यह काम किया! – Christian

+0

मेरे पास बिल्कुल वही समस्या है लेकिन यह मेरे लिए आईपैड 3.2 पर काम नहीं कर रहा है, मैं रोटेशन और स्केल प्रॉपर्टी तक पहुंचने का प्रयास करता हूं लेकिन समूहीकृत एनीमेशन कुछ मिलीसेकंड के तुरंत बाद बंद हो जाता है और परतें वापस आती हैं! – brutella

2

मेरा मानना ​​है कि CAAnimationGroup वह नहीं है जो आप चाहते हैं। CAAnimationGroup के लिए दस्तावेज़ से:

CAAnimationGroup वर्गीकृत किया और समवर्ती चलाने के लिए एनिमेशन एकाधिक अनुमति देता है। समूहीकृत एनिमेशन CAAnimationGroup उदाहरण द्वारा निर्दिष्ट समय स्थान पर चलाया जाता है।

ऐसा लगता है कि आप नहीं चाहते हैं कि आपके एनिमेशन एक साथ क्रमशः चलें। ऐसा करने के आसान तरीके हो सकते हैं, लेकिन मुझे animationDidStop:finished: विधि पर भरोसा मिल रहा है। ऐसा करने के लिए, अपनी पहली एनीमेशन बनाएं, और उसके प्रतिनिधि को किसी ऑब्जेक्ट पर सेट करें जो animationDidStop:finished: विधि को लागू करेगा, और एनीमेशन को सामान्य के रूप में जोड़ें (CAAnimationGroup का उपयोग किए बिना)। विधि में:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
{ 
    // Create the second animation and add it 
} 
+0

मैं चाहता हूं कि ये एक ही समय में हों। समस्या यह है कि समूह का उपयोग करते समय, rockAnimation नहीं चलता है। केवल ज़ूमएनीमेशन चलता है। – Christian

+0

समूहीकृत एनिमेशन की अवधि उनके CAAnimationGroup की अवधि तक स्केल नहीं की गई है। इसके बजाय, एनिमेशन एनीमेशन समूह की अवधि के लिए बंद कर रहे हैं। आप यह देखने के लिए कि क्या यह समस्या है, आप अपने सभी एनीमेशन को 5 सेकंड में चला सकते हैं (और दोहराना गणना हटा सकते हैं)। –

+0

दुर्भाग्य से यह काम नहीं किया। – Christian

संबंधित मुद्दे