2012-08-01 4 views
5

removeFromSuperview: से पहले मेरे उपयोगकर्ता इंटरफ़ेस (लगभग 4 तत्व) के कई तत्वों को स्थानांतरित करने के लिए मैं animateWithDuration:animations:completion: का उपयोग कर रहा हूं।कार्रवाई करने से पहले कितने ब्लॉक निष्पादन पूरा कर चुके हैं?

मेरा सवाल यह है कि, मैं कैसे जान सकता हूं कि उन सभी एनिमेशन removeFromSuperview: पर कॉल करने से पहले पूरा हो गए हैं?

+0

क्या आप कई ब्लॉकों को बनाने के बजाए एनिमेशन अनुभाग में एक बार में उन्हें एनिमेट नहीं कर सके? –

+0

यदि एनिमेशन में अलग-अलग अवधि और शैलियों – Goles

+0

संभावित डुप्लिकेट हैं [UIView एनिमेट के एक नेस्टेड समूह के लिए एकल समापन ब्लॉक कैसे शुरू करें WithDuration कॉल?] (Http://stackoverflow.com/questions/8421441/how-to-invoke -ए-सिंगल-समापन-ब्लॉक-फॉर-ए-नेस्टेड-ग्रुप-ऑफ-यूविव-एनीमेटिव) –

उत्तर

9

ठीक है, मेरे अपने प्रश्न का उत्तर देने के लिए।

// Create dispatch queue & group 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_group_t group = dispatch_group_create(); 

    // Two group enters 
    dispatch_group_enter(group); 
    dispatch_group_enter(group); 

    // (notice the group parameter in dispatch_group_leave) 
    [UIView animateWithDuration:0.3 animations:^{ 
     self.pickerView.frame = CGRectMake(self.pickerView.frame.origin.x 
              , self.view.bounds.size.height + self.pickerView.frame.size.height/2 
              , self.pickerView.frame.size.width 
              , self.pickerView.frame.size.height); 
    } completion:^(BOOL finished){ 
     dispatch_group_leave(group); 
    }]; 


    [UIView animateWithDuration:0.3 animations:^{ 
     self.navigationBar.frame = CGRectMake(self.navigationBar.frame.origin.x 
               , -self.navigationBar.frame.size.height 
               , self.navigationBar.frame.size.width 
               , self.navigationBar.frame.size.height); 
    } completion:^(BOOL finished){ 
     dispatch_group_leave(group); 
    }]; 

    // Finishing callback 
    dispatch_group_notify(group, queue, ^{ 
     [self.view removeFromSuperview]; 
    }); 

    // Release the group 
    dispatch_release(group); 

मुझे आशा है कि यह किसी और के लिए एक उदाहरण के रूप में सेवा कर सकते हैं:

मैं कुछ इस तरह कर रही है समाप्त हो गया।

+2

इसे नियमित उत्तर के रूप में जोड़ना। –

0

एक प्रेषण कतार बनाएं, इसे आपके द्वारा किए जा रहे एनिमेशन की संख्या से निलंबित करें। कतार में एक ब्लॉक जोड़ें जो पर्यवेक्षण से हटा देता है। प्रत्येक एनीमेशन के समापन ब्लॉक में निलंबित कतार फिर से शुरू करें। जब अंतिम व्यक्ति पूरा हो जाता है, तो कतारबद्ध ब्लॉक चलाएगा।

+0

क्या आप कुछ कोड के साथ विस्तृत कर सकते हैं? – Goles

1

आप CATransaction का भी उपयोग कर सकते हैं। यह किसी भी एम्बेडेड एनिमेशन को पकड़ लेगा:

[CATransaction begin]; 
[CATransaction setCompletionBlock:^{ // all animations finished here }]; 
[UIView animateWithDuration... 
[UIView animateWithDuration... 
... 
[CATransaction commit]; 

इससे आपको एनिमेशन का ट्रैक रखने की आवश्यकता नहीं होगी।

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