2009-09-21 30 views
5

शुरू करने से पहले एक आईफोन एनीमेशन कंटेनर दृश्य को संशोधित करना मैं एक कार्ड गेम में कुछ बुनियादी एनीमेशन जोड़ रहा हूं जिस पर मैं काम कर रहा हूं। (मेरा पहला आईफोन ऐप।)एनीमेशन

मैं कस्टम यूआईवी व्यू क्लास "एनीमेशन कोंटेनर" बना रहा हूं, जो छवि 1 से छवि 2 तक फिसलता है, जबकि rect1 से rect2 तक चलता है। मेरा अंतिम इरादा इन चारों कंटेनरों को एक साथ अपने संक्रमण करने के लिए है।

मेरी समस्या यह है कि एनीमेशन छवि 1 नहीं दिखा रहा है ... इसलिए फ्लिप संक्रमण का केवल अंतिम भाग दिखाई देता है।

हालांकि, अगर मैं रीसेट को स्पर्श करके पहले एनीमेशन रीसेट करता हूं, तो सब कुछ पूरी तरह से काम करता है। दूसरे शब्दों में, यदि मैं बार-बार फ्लिप दबाता हूं, तो मुझे केवल आधे संक्रमण मिलते हैं ... लेकिन अगर मैं पहले रीसेट दबाता हूं, तो सब कुछ एक फ्लिप के लिए पूरी तरह से काम करता है।

तो, मैं एनीमेशन को सही ढंग से रीसेट करने के लिए कैसे प्राप्त कर सकता हूं?

नीचे कोड, एक स्क्रीनशॉट है, और यहां पूर्ण लिंक है: Project Zip File 700k

alt text http://www.robsteward.com/cardflip.jpg

- (void)displayWithImage1 {  //RESET button calls this 
    self.frame = rect1; 
    [image2 removeFromSuperview]; 
    [self addSubview:image1]; 
    [self setNeedsDisplay]; //no help: doesn't force an update before animation 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; //<---this is what the reset button calls 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

धन्यवाद!

+0

मैं आधे बदसूरत कामकाज के साथ आया हूं। मैंने एक "डमी" एनीमेशन जोड़ा और अपनी कक्षा को अपने सेटएनीमेशन डीडस्टॉप चयनकर्ता के लिए एक प्रतिनिधि बनाया। डमी एनीमेशन की अवधि 0.0 है और केवल दृश्य को rect1 पर ले जाती है। जब डमी के स्टॉप चयनकर्ता को बुलाया जाता है, तो मैं ऊपर से "वास्तविक" एनिमेटेड फ्लिप कोड करता हूं। पूरी तरह कार्यात्मक, और ऐसा लगता है कि कम से कम 4 एक साथ चल रहे हैं। ये में। एलओएल – Rob

+1

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

उत्तर

12

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

- (void)_runTheAnimation { 
    // Moved here from -runTheAnimation 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; 
    [self performSelector:@selector(_runTheAnimation) withObject:nil afterDelay:0.0]; 
} 
+1

बहुत बढ़िया! बहुत बहुत धन्यवाद। मैं बिल्कुल स्पष्ट नहीं था कि चयनकर्ता तुरंत निष्पादित नहीं हुए थे। सब कुछ अब महान काम कर रहा है। 200 प्रतिनिधि बकाया भुगतान करने के लिए एक छोटी सी कीमत थी। मैंने इसके साथ 10 घंटे गड़बड़ कर बिताई है। – Rob

+1

चयनकर्ताओं को तुरंत भेजा जाता है (-peformSelector :) उपर्युक्त विधि है -फॉर्मफॉर्मर: withObject: afterDelay :, जो भविष्य में किसी बिंदु पर चयनकर्ता के लिए रनलोप पर शेड्यूल करता है। 0 की देरी प्रभावी ढंग से "अगली बार रन लूप पुनरावृत्त करती है।" चयनकर्ता स्वयं किसी ऑब्जेक्ट को पास करने के लिए एक संदेश का वर्णन करते हैं। उस संदेश को पारित करने का कार्य निष्पादक चयनकर्ताओं द्वारा किया जाता है ... विधियों। –

+1

कूल, मुझे लगता है कि मैं समझता हूं। अभी भी कोको, ऑब्जेक्टिव-सी और सभी चीजों पर आईफोन की गति बढ़ रही है ... लेकिन मैं अब तेजी से सीख रहा हूं। एक बार फिर धन्यवाद। – Rob