2011-06-13 9 views
5

मैं के सरल कोड है:जारी रखने से पहले एक अलग वर्ग में एनीमेशन समाप्त होने तक मैं कैसे प्रतीक्षा करूं?

[otherClass doMethodOneWhichHasAnimation]; 

और है कि एनीमेशन 0.8 सेकंड तक रहता है। कोड है कि एक ViewController धक्का द्वारा पीछा किया:

SchemeView *schemeView = [[SchemeView alloc] init]; 
    [self.navigationController pushViewController:schemeView animated:YES]; 
    [schemeView release]; 

समस्या यह है, यह इंतजार किए बिना ViewController धक्का, और मैं इसे इंतजार करना चाहते हैं। देरी करने से पहले पूरी एनीमेशन शामिल होने से बस पूरी चीज में देरी हो जाती है।

कोड के दूसरे बिट को चलाने से पहले 0.8 सेकंड प्रतीक्षा करने के लिए मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

14

के बाद एनीमेशन

[UIView animateWithDuration:0.8 
     animations:^{ 
      // Animation 
     } 
     completion:^(BOOL finished){ 

      // PushView 

     }]; 

किया जाता है < iOS के लिए 4 setAnimationDidStopSelector पर एक नज़र डालें आप धक्का कर सकते हैं

या

[self performSelector:@selector(metohodToPushView) withObject:nil afterDelay:0.8]; 
14

आप एक पूरा होने के ब्लॉक को चलाने के लिए उपयोग कर सकते हैं CATransaction किसी भी एनीमेशन के बाद, एनीमेशन बनाता है जो विधि के स्रोत कोड को बदलने के बिना। आपको link with the QuartzCore framework की आवश्यकता होगी और आपको #import <QuartzCore/QuartzCore.h> की आवश्यकता होगी। फिर आप यह कर सकते हैं:

[CATransaction begin]; { 

    [CATransaction setCompletionBlock:^{ 
     // This block runs after any animations created before the call to 
     // [CATransaction commit] below. Specifically, if 
     // doMethodOneWhichHasAnimation starts any animations, this block 
     // will not run until those animations are finished. 

     SchemeView *schemeView = [[SchemeView alloc] init]; 
      [self.navigationController pushViewController:schemeView animated:YES]; 
      [schemeView release]; 
    }]; 

    // You don't need to modify `doMethodOneWhichHasAnimation`. Its animations are 
    // automatically part of the current transaction. 
    [otherClass doMethodOneWhichHasAnimation]; 

} [CATransaction commit]; 
+0

मैं इस काम करने के लिए अच्छा लगेगा, लेकिन यह मेरी उपयोग के लिए काम नहीं करता है (जो लोगों को स्क्रॉल प्रदर्शन करने के लिए है किसी एनिमेटेड टेबल दृश्य अपडेट के बाद एक पंक्ति)। –

+0

@ StianHøiland लेन-देन के अंदर अपनी तालिका दृश्य में 'layoutIfNeeded' भेजने का प्रयास करें (जहां मेरा उदाहरण 'doMethodOneWhichHasAnimation' भेजता है)। –

+0

दुर्भाग्य से कोई भाग्य नहीं। –

0

मुझे एनिमेशन चलाने के लिए एक नई कक्षा बनाकर इस समस्या को हल किया गया।

यह कक्षा एनीमेशन की शुरुआत के साथ सिंक्रनाइज़ किए गए कितने समय की गणना करती है।

आप वर्ग और दोनों एनीमेशन ब्लॉक और वर्ग काउंटर करने के लिए एनीमेशन के लिए समय में फ़ीड में यह संख्या लेता है।

जब काउंटर अपने अंत तक पहुँच गया है आप जानते हैं कि एनीमेशन भी समाप्त हो गया है।

... यादृच्छिक जटिल पुस्तकालयों के बिना सभी।

-2

बस देरी समय अंतराल

जैसे के साथ एक विधि कॉल

[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.00]; 
+1

यह उत्तर बहुत गलत है। आप बस दौड़ की स्थिति के लिए पूछ रहे हैं। –