2008-10-22 12 views
27

मैं ऊपर से नीचे तक एक दृश्य स्लाइड बनाने की कोशिश कर रहा हूं। यह एक बड़ा सौदा नहीं है, मैंने इसके लिए CABasicAnimation का उपयोग किया। समस्या यह है कि जब मैं दृश्य को हटाना चाहता हूं। मैं इस एनीमेशन का उपयोग करता हूं।एनीमेशन के बाद, स्थिति स्थिति रीसेट

CABasicAnimation *animation; 
animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
[animation setDelegate:self]; 
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.layer.position.x, 0 - self.view.bounds.size.height/2)]; 
animation.fromValue = [NSValue valueWithCGPoint:self.view.layer.position]; 
animation.autoreverses = NO; 
animation.repeatCount = 0; 
animation.duration = 0.25; 
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]; 
[self.view.layer addAnimation:animation forKey:@"moveX"]; 

जो दृश्य को पूरी तरह एनिमेट करता है। लेकिन, एनीमेशन खत्म होने के बाद, मेरा विचार फिर से दिखाई देता है। इसलिए मैंने यह लाइन जोड़ा:

[self.view removeFromSuperview]; 

जो दृश्य को हटा देता है, लेकिन बिना एनीमेशन के। इसलिए मैं निकालें कोड इस प्रतिनिधि को जोड़ने का निर्णय लिया:

-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag 

तो अब, एनीमेशन काम करता है, दृश्य गायब हो जाता है, लेकिन कभी कभी, मैं दृश्य दिखाई देते हैं और तेजी से गायब हो जाते हैं देख सकते हैं, एनीमेशन के बाद की तरह है, दृश्य प्रकट होता है, तो animationDidStop प्रतिनिधि को बुलाया जाता है, और दृश्य गायब हो जाता है, जाहिर है यह भयानक है। मैं क्या गलत कर रहा हूं?

उत्तर

15

ठीक है, ऐप्पल नमूना "मूवमे" के अनुसार, यह (हटाया गया अपनंपूर्णता) काम करना चाहिए, हालांकि, ऐसा प्रतीत नहीं होता है।

तो, अपने कोड के बाद इन लाइनों जोड़ें:

 
[self.view.layer addAnimation:animation forKey:@"moveX"]; 
self.view.layer.position = [animation.toValue CGPointValue]; 

यह सुनिश्चित करता है कि एनीमेशन रन के बाद, परत ठीक से स्थिति में है।

+0

मैंने ऐसा क्यों नहीं देखा? धन्यवाद, यह मेरी समस्या हल हो गया। मुझे लगता है कि यह एक त्रुटि है, मुझे ऐसा नहीं करना चाहिए, लेकिन कम से कम यह काम करता है। – carlos

+0

मैं सहमत हूं, या हम कुछ खो रहे हैं, क्योंकि यह नमूना में काम करता है। अधिक प्रयोग करने की आवश्यकता है, मुझे लगता है! –

-2

क्या आप दृश्य की छुपी हुई संपत्ति को YES पर सेट कर सकते हैं?

मुझे लगता है कि यह होगा:

self.view.hidden = YES; 

लेकिन यह हो सकता है:

[self.view setHidden:YES]; 

मैं पता चला है मैं गुण के गुणों का उपयोग करने की उचित तरीके से पता लगाना पर सुंदर लंगड़ा कर रहा हूँ।

+0

मैंने ऐसा किया लेकिन मुझे एक ही परिणाम मिला। – carlos

+0

यह वही है। – Ricardo

0

रॉब के रूप में छुपाए जाने के दृश्य को सेट करने से सुझाव देना चाहिए।

गुणों के गुणों के लिए मैं ओबीजेसी 2.0 शैली के साथ रहूंगा जैसा कि आपके पास पहले से ही आपके कोड में है।

set.view.hidden = YES; 
0

यह एक मुझे भी थोड़ा। आप एनीमेशन के हटाए गए अपूर्ण नमूना को NO पर सेट करना चाहते हैं। यह हां के लिए डिफ़ॉल्ट है, जिसका मतलब है कि एनीमेशन पूर्ण होने के बाद, इसे हटा दिया गया है, और दृश्य इसकी प्रारंभिक स्थिति में बदल जाता है।

+0

वही है, मैंने यह और एक ही परिणाम की कोशिश की। जब मैं एक बटन दबाता हूं, तो मैं इस कोड को एक ही दृश्य से कॉल कर रहा हूं। – carlos

66

शायद इन गुणों को सेट करना चाहते हैं। वे प्रस्तुति को एनीमेशन के अंत में संरक्षित करने का कारण बनती हैं।

animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;

फिर "animationDidStop:" विधि एनीमेशन के अंत में देखने को हटाने के लिए इस्तेमाल किया जा सकता:

-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag { 
    if (animation == [containerView.layer animationForKey:@"moveX"]) { 
     // remove view here, add another view and/or start another transition 
    } 
} 
+0

+1! मैंने 'हटाया गया अपूर्ण' सेट करने की कोशिश की लेकिन कोई पासा नहीं। इसके अलावा, 'fillMode = kCAFillModeForwards' जोड़कर इसे ठीक किया गया है। महान! –

+1

जब सीए एक परत को एनिमेट करना शुरू करता है, तो यह एक प्रतिलिपि बनाता है और उसके बाद वृद्धिशील रूप से गुणों को सेट करता है और इसे फिर से चलाता है। यह तकनीक काम करती है, लेकिन यह प्रस्तुति परत को हमेशा के लिए एनिमेट करती रहती है (उसी मूल्य के साथ बार-बार)। यदि आप प्रस्तुति परत को मरना चाहते हैं, तो आप प्रस्तुति में सेटर को मॉडल परत में से किसी एक को लिंक करना चाहते हैं। ऐसा करने का एक तरीका है अपनी संपत्ति के लिए ऑब्जेक्ट पॉइंटर का उपयोग करना, जैसे कि एनएसवेल्यू, आदिम के बजाए। फिर जब प्रस्तुति परत संपत्ति सेट करती है, तो मॉडल परत भी इसे उठाएगी। – AlexChaffee

+0

नोट, मैंने पृष्ठभूमि रंग की मेरी एनीमेशन के लिए इस विधि की कोशिश की, लेकिन कभी-कभी इसे मूल रंग में एक झिलमिलाहट का उत्पादन किया जाता है। आश्चर्य की बात है, [बेन के समाधान] का उपयोग करके (http://stackoverflow.com/a/227798/377384) काम किया (अभी तक कोई झिलमिलाहट नहीं)। –

3

मैं जब एक एनीमेशन समूह के कई एनिमेशन प्रदर्शन कर इस मुद्दे था। मुझे एनीमेशन समूह पर कुछ गुण सेट करना था, व्यक्तिगत एनिमेशन नहीं।

CAAnimationGroup *animGroup = [CAAnimationGroup animation]; 

// MAKE SURE YOU HAVE THESE TWO LINES. 
animGroup.removedOnCompletion = NO; 
animGroup.fillMode = kCAFillModeForwards; 

animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, nil]; 
animGroup.duration = tAnimationDuration; 
[tImageView.layer addAnimation:animGroup forKey:nil]; 
संबंधित मुद्दे