2011-05-07 7 views
6

क्या इसे रोक दिया गया है, जबकि प्रेजेंटेशन स्थिति पढ़ने के साथ कोई समस्या है?क्या परत को रोके जाने पर कैलियर स्थिति अपडेट करने में कोई समस्या है?

मैं CALayer को रोकने और फिर से शुरू करने का प्रयास कर रहा हूं। एक बार CALayer रुक गया है, मैं परत की स्थिति को वर्तमान प्रस्तुति स्थिति के साथ अपडेट करना चाहता हूं। जब मैं ऐसा करने की कोशिश करता हूं, परत परत फिर से शुरू करने के बाद परत थोड़ा सा झिलमिलाहट करता है।

इस कोड को मैं रोक सकते हैं और CALayer (एक Technical Q&A QA1673 एप्पल द्वारा आपूर्ति के आधार पर) फिर से शुरू करने का उपयोग कर रहा है: यदि मैं pauseLayer में layer.position = ((CALayer*)[layer presentationLayer]).position; uncomment

CFTimeInterval pausedTime; 
void pauseLayer(CALayer *layer) 
{ 
    pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
    layer.speed = 0.0; 
    layer.timeOffset = pausedTime; 
    layer.beginTime = 0; 
// layer.position = ((CALayer*)[layer presentationLayer]).position; 
} 
void resumeLayer(CALayer *layer) 
{ 
    layer.speed = 1.0; 
    layer.timeOffset = 0.0; 
    layer.beginTime = 0.0; 

    CFTimeInterval _elapsedTimeSincePaused = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
    layer.beginTime = _elapsedTimeSincePaused; 
} 

, परत flickers एक बार मैं resumeLayer फोन ।

- (void) startAnimation:(id)sender 
{ 
    layer10Animation = [CABasicAnimation animationWithKeyPath:@"position.x"]; 
    layer10Animation.duration = 1; 
    layer10Animation.toValue = [NSNumber numberWithInt:300]; 
    layer10Animation.fromValue = [NSNumber numberWithInt:20]; 
    layer10Animation.repeatCount = 100; 
    layer10Animation.autoreverses = YES; 

    [layer10 addAnimation:layer10Animation forKey:nil]; 
} 

सादर

+1

क्या आप झिलमिलाहट से क्या मतलब है? क्या परत गायब हो जाती है और फिर अचानक दिखाई देती है, या रोके गए स्थिति के संबंध में ऑफसेट के साथ फिर से शुरू होती है? – MiguelB

+0

परत गायब हो जाती है और फिर अचानक प्रकट होती है। – haroldcampbell

उत्तर

4

वहाँ एक CALayer स्थिति को अद्यतन करने, जबकि रुके साथ कोई मुद्दा नहीं है:

यह मेरी एनीमेशन कोड है। स्वाभाविक रूप से यह झिलमिलाहट देगा जो आप उल्लेख करते हैं। ऐसा इसलिए है क्योंकि आप परत की स्थिति मध्य एनीमेशन अपडेट कर रहे हैं।

भूलें कि CABasicAnimation बनाने और इसे CALayer पर जोड़ने से परत की सेटिंग्स में कोई बदलाव नहीं आता है। यह परत का उपयोग कर एनीमेशन बनाता है, लेकिन यह परत को नहीं बदलता है।

यही कारण है कि एनीमेशन समाप्त होने के बाद, आप परत को उसी स्थिति में वापस देख पाएंगे जो पहले था।

- (void)animationDidStart:(CAAnimation *)theAnimation 
{ 
    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue 
        forKey:kCATransactionDisableActions]; 
    myLayer.position = targetPosition;  
    [CATransaction commit]; 
} 

हाँ:

इस वजह से

, अगर आप बी करने के लिए एक से एक परत एनिमेट कर रहे हैं, यदि आप परत चाहते बाद एनीमेशन समाप्त हो गया है B में प्रकट करने के लिए, तो आप इस प्रतिनिधि कॉलबैक की आवश्यकता होगी , यह animationDidStart है। अगर हमने इसे animationDidStop का उपयोग करके किया तो आप एक और झिलमिलाहट देखेंगे। परत बी की एनीमेशन की अंत स्थिति में होगी, फिर आप ए पर एक झिलमिलाहट देखेंगे, और फिर आप इसे फिर से बी पर देखेंगे।

animationDidStart का उपयोग करके हम targetPosition, यानी B होने की स्थिति निर्धारित करते हैं क्योंकि यह वह जगह है जहां हम इसे पूरा होने पर देखना चाहते हैं।

अब QA1673 के संबंध में, आप इसके साथ क्या कर रहे हैं, एनीमेशन की गति शून्य पर सेट कर रहा है, और वर्तमान CACurrentMediaTime() का टाइमस्टैम्प प्राप्त कर रहा है। फिर से शुरू करने पर, आप गति को सामान्य पर वापस डाल देते हैं, और विराम समय के दौरान किए गए किसी भी ऑफसेट को लागू करते हैं।

यह सब तब तक बहुत भ्रमित लगता है जब तक आप इसे लटका नहीं देते। क्या मैं कुछ पढ़ने और वीडियो की सिफारिश कर सकता हूं?

निश्चित रूप से Core Animation Rendering Architecture का एक पठन है।

वीडियो कि अत्यधिक की सिफारिश कर रहे हैं:

WWDC 2010 Sessions 424 and 425 Core Animation in Practice Parts 1 and 2

WWDC 2011 Session 421 Core Animation Essentials

और

Developer Videos Session 716 Core Animation Techniques for iPhone and Mac

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

  • कोई संबंधित समस्या नहीं^_^