2010-02-21 20 views
43

मेरे पास आईफोन की मूल कताई एनीमेशन है। क्या कोई तरीका है कि मैं एनीमेशन को "रोक" सकता हूं ताकि दृश्य की स्थिति बनाए रखा जा सके? मुझे लगता है कि ऐसा करने का एक तरीका एनीमेशन को "निकालने" के बजाय "पूर्ण" करने का कारण बनना होगा, मैं यह कैसे करूँगा?क्या CABasicAnimation को रोकने का कोई तरीका है?

CABasicAnimation* rotationAnimation; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2]; 
rotationAnimation.duration = 100; 
rotationAnimation.cumulative = YES; 
rotationAnimation.repeatCount = HUGE_VALF; 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.fillMode = kCAFillModeForwards; 
[myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

उत्तर

143

हाल ही में दिखाई दिया एप्पल के तकनीकी टिप्पणी QA1673 का वर्णन करता है को रोकने का तरीका/फिर से शुरू परत की एनीमेशन।

रोकें और फिर से शुरू एनिमेशन लिस्टिंग के नीचे है:

-(void)pauseLayer:(CALayer*)layer 
{ 
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
    layer.speed = 0.0; 
    layer.timeOffset = pausedTime; 
} 

-(void)resumeLayer:(CALayer*)layer 
{ 
    CFTimeInterval pausedTime = [layer timeOffset]; 
    layer.speed = 1.0; 
    layer.timeOffset = 0.0; 
    layer.beginTime = 0.0; 
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
    layer.beginTime = timeSincePause; 
} 

संपादित करें: आईओएस 10 नए एपीआई शुरू की - UIViewPropertyAnimator अधिक सहभागी एनिमेशन को संभालने के लिए अनुमति देता है, उदाहरण के लिए इसे आसान बना देता रोक सकते हैं और एनीमेशन को फिर से शुरू करने के लिए या कुछ विशेष प्रगति मूल्य के लिए इसे 'तलाश' करें।

+0

यह मेरे लिए ठीक काम कर रहा है, फिर भी, जब मैं रोके गए राज्य में हूं, और अपने डिवाइस को घुमाता हूं, तो मैं एप्लिकेशन के साथ बातचीत करने की सभी क्षमता खो देता हूं। यह वास्तव में दुर्घटनाग्रस्त नहीं हुआ है, हालांकि यह "जमे हुए" दिखाई देता है। क्या "willAnimateRotationToInterfaceOrientation" के साथ कोई संभावित संघर्ष है? – YoCoh

+0

@YoCoh, यह वास्तव में एक दृश्य के लिए मानक रोटेशन एनिमेशन को रोक सकता है, और एनिमेशन के दौरान उपयोगकर्ता इंटरैक्शन अक्षम हो सकता है (शायद यह मामला है) और मानक एनीमेशन समाप्त नहीं होता है, आप अक्षम स्थिति में यूआई के साथ समाप्त हो जाते हैं। यह सुनिश्चित नहीं है कि इसे कैसे काम करें – Vladimir

+0

http://ronnqvi.st/controlling-animation-timing/ बताता है कि यह कोड कैसे काम करता है –

6

presentationLayer के राज्य से मिलान करने के लिए अपने दृश्य के परत की वर्तमान स्थिति सेट करें, फिर एनीमेशन निकालें:

CALayer *pLayer = [myView.layer presentationLayer]; 
myView.layer.transform = pLayer.transform; 
[myView.layer removeAnimationForKey:@"rotationAnimation"]; 
+4

हालांकि इस स्थिति की बचत होती है, यह के रूप में काम नहीं कर रहा है शुरुआती बिंदु जब मैं दृश्य में एनीमेशन को दोबारा जोड़ता हूं, तो दृश्य वें में छोटी दूरी के लिए समायोजित करने के लिए थोड़ा धीमा हो जाता है एक ही समय की मात्रा। क्या एक और कदम है जिसे एनीमेशन को फिर से शुरू करने में सक्षम होने के लिए लिया जाना चाहिए? – mclaughlinj

0

आपके पास टाइमर का उपयोग करें या एनीमेशन प्रतिनिधि विधि संभाल कर सकते हैं:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 

यहाँ मेरी कोड है:

// ... 
[self startAnimation]; 
// ... 

- (void)startAnimation { 
CABasicAnimation* rotationAnimation; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.fromValue = [NSNumber numberWithFloat:0]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: M_2_PI]; 
rotationAnimation.duration = 1.0; 
rotationAnimation.cumulative = YES; 
// rotationAnimation.repeatCount = 0; // <- if repeatCount set to infinite, we'll not receive the animationDidStop notification when the animation is repeating 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.fillMode = kCAFillModeForwards; 
rotationAnimation.delegate = self; // <- hanlde the animationDidStop method 
[myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

} 

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
if (shouldContinueAnimation) // <- set a flag to start/stop the animation 
    [self startAnimation]; 
} 

आशा है कि यह आप कर सकते हैं।

+4

सावधानी !!! यह तब तक करने का अनुशंसित तरीका नहीं है जब तक कि आपको ऐसा करने की कोई विशेष आवश्यकता न हो। कल्पना कीजिए कि आपके पास अनंत चल रही एनीमेशन है। यह विधि तब मदद नहीं करेगी जब हम ऐप को पृष्ठभूमि में प्रवेश करने से पहले एनीमेशन को रोक रहे हों और फिर अग्रभूमि में प्रवेश करते समय इसे फिर से शुरू करने का प्रयास करें। – Anshu

0

सरल एक

self.viewBall.layer.position = self.viewBall.layer.presentationLayer().position 
7

उत्तर स्विफ्ट 3 के लिए:

@Vladimir क्रेडिट

कोड:

func pauseAnimation(){ 
    var pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) 
    layer.speed = 0.0 
    layer.timeOffset = pausedTime 
} 

func resumeAnimation(){ 
    var pausedTime = layer.timeOffset 
    layer.speed = 1.0 
    layer.timeOffset = 0.0 
    layer.beginTime = 0.0 
    let timeSincePause = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime 
    layer.beginTime = timeSincePause 
} 
संबंधित मुद्दे

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