2011-10-17 12 views
6

दूसरे के समाप्त होने के बाद चलाने के लिए मेरे पास एक CABasicAnimation कैसे हो सकता है? अनुक्रमिक रूप से दूसरे शब्दों में। मैंने दूसरी एनीमेशन का प्रारंभिक समय जोड़ा है, हालांकि ऐसा लगता है कि दूसरी एनीमेशन निष्पादित नहीं होती है:चल रहे CABasicAnimation अनुक्रमिक रूप से

CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    appearance.duration = 0.5; 
    appearance.fromValue = [NSNumber numberWithFloat:0]; 
    appearance.toValue = [NSNumber numberWithFloat:340]; 
    appearance.repeatCount = 1; 
    appearance.fillMode = kCAFillModeForwards; 
    appearance.removedOnCompletion = NO; 
    [notif.layer addAnimation:appearance forKey:@"transform.translation.y"]; 



    CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    theAnimation.duration = 0.5; 
    theAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    theAnimation.toValue = [NSNumber numberWithFloat:10]; 
    theAnimation.repeatCount = 3; 
    theAnimation.autoreverses = YES; 
    theAnimation.fillMode = kCAFillModeForwards; 
    theAnimation.removedOnCompletion = NO; 
    theAnimation.beginTime = appearance.beginTime + appearance.duration; 
    [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"]; 

कोई विचार क्यों?

उत्तर

15

अपडेटेड कोड, यह काम करेगा!

1 एनीमेशन

CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    [appearance setValue:@"animation1" forKey:@"id"]; 
    appearance.delegate = self; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)]; 
    appearance.duration = 0.5; 
    appearance.fromValue = [NSNumber numberWithFloat:0]; 
    appearance.toValue = [NSNumber numberWithFloat:340]; 
    appearance.repeatCount = 1; 
    appearance.fillMode = kCAFillModeForwards; 
    appearance.removedOnCompletion = NO; 
    [notif.layer addAnimation:appearance forKey:@"transform.translation.y"]; 

2 एनिमेशन:

- (void)animationDidStop:(CAAnimation *)theAnimation2 finished:(BOOL)flag { 
    if([[theAnimation2 valueForKey:@"id"] isEqual:@"animation1"]) { 
    CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    theAnimation.duration = 0.5; 
    theAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    theAnimation.toValue = [NSNumber numberWithFloat:10]; 
    theAnimation.repeatCount = 3; 
    theAnimation.autoreverses = YES; 
    theAnimation.fillMode = kCAFillModeForwards; 
    theAnimation.removedOnCompletion = NO; 
    theAnimation.beginTime = appearance.beginTime + appearance.duration; 
    [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"]; 
} 

}

इस तरह 2 एनीमेशन 1 एक खत्म होने के बाद सक्रिय होगा है।

+0

इस काम नहीं किया काम नहीं किया ..एनीमेशनडिडस्टॉप को असीम – adit

+0

कहा जाता था क्या आपने दोनों कोड टुकड़े कॉपी किए थे? वे एक जैसे नहीं हैं। –

+0

यदि आपके पास लूप है, तो क्या आप वाकई दूसरी एनीमेशन के प्रतिनिधि को सेट नहीं करते हैं, जैसे कि दूसरी एनीमेशन एनीमेशनडिडटॉप को भी कॉल कर रहा है? – isaac

1

सबसे आसान काम करने के लिए पहली एनीमेशन के लिए एक प्रतिनिधि स्थापित किया गया है और उस ऑब्जेक्ट में -animationDidStop:finished: लागू किया गया है। उस विधि में, दूसरी एनीमेशन को स्पर्श करें।

+0

नहीं – adit

1

आपकी एनीमेशन योजना के अनुसार नहीं चलने का कारण है जिस तरह से आपने & कोड कोर एनीमेशन को कोड किया है। कोर एनिमेशन सभी जीपीयू संचालित हैं। सीए वास्तव में एनिमेशन को बेहतरीन रूप से प्रस्तुत करने के लिए कुछ चीजों को बहुत अच्छी तरह से संभालता है।

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

अंतिम पंक्ति आईपी है। सीए एक अलग थ्रेड में चल रहे हैं (& मुख्य धागा नहीं)। तो आपकी समस्या पर वापस आते हुए, आपके पास सीए के 2 ब्लॉक एक ही transform.translation.y को एनिमेट करने की कोशिश कर रहे हैं, दोनों एक ही समय में! यह कैसे काम करेगा?

तो यह हल करने के लिए, या तो करते हैं -

  1. क्या किसी को सुझाव दिया, दूसरी एनीमेशन के लिए एक देरी डाल इतना है कि पहले उत्साहित के बाद, पहली ओएस से अधिक के बाद ही में दूसरी किक।
  2. या एक ही ब्लॉक में पूरी एनीमेशन करने की कोशिश करें (फिर किसी ने सुझाव दिया है)।

मैं कोर एनीमेशन काम के तरीके के पीछे सिद्धांत & तर्क को हाइलाइट करना चाहता था। उम्मीद है कि यह मदद करता है ...

0

CAAnimationGroup का उपयोग करना सबसे आसान और साफ तरीका है। इस जवाब पर एक नज़र डालें - इससे मुझे मदद मिली।

Chaining Core Animation animations

+3

'CAAnimationGroup' समवर्ती, क्रमिक एनिमेशन नहीं है, आमतौर पर एकाधिक गुणों को एनिमेट करने के लिए। – Barry