2009-02-18 16 views
8

मेरे पास कई CALayers है कि मैं एक नई zPosition पर एनिमेट करने की कोशिश कर रहा हूं जिसमें प्रत्येक परत दूसरों से थोड़ी देर में देरी हो रही है।एकाधिक कैलियर एनिमेटिंग, लेकिन एक ही समय में अंतरिक्ष

प्रत्येक एनीमेशन को 0.25 सेकंड लेना चाहिए और पिछली एनीमेशन शुरू होने के बाद 0.05 सेकंड शुरू करना चाहिए। प्रत्येक एनीमेशन के अंत में परत परत पेड़ से हटा दिया जाएगा।

मैं अपनी परतों को समाप्त करने के लिए सफलतापूर्वक -animationDidStop:finished: प्रतिनिधि विधि का उपयोग कर रहा हूं लेकिन मैं एनिमेशन को ठीक से ऑर्डर करने में सक्षम नहीं हूं।

क्या इस तरह से एनिमेशन को शेड्यूल करना संभव है, और कैसे?

उत्तर

17

मैं अभी भी अन्य सुझाव सुनना चाहता हूं लेकिन मुझे लगता है कि मैंने इसे हल कर लिया है।

अब मैं विशिष्ट CAAnimation ऑब्जेक्ट्स बना रहा हूं और beginTime संपत्ति निर्दिष्ट कर रहा हूं। मैं इसे पहले कर रहा था और यह काम नहीं कर रहा था, मुझे अंत में एहसास हुआ कि beginTime संपत्ति को सम्मानित करने के लिए एनीमेशन को CAAnimationGroup में जोड़ा जाना है।

तो, मेरे कोड इस तरह दिखता है:

NSArray *layers = /* layers to be animated away */ 
CGFloat startOffset = 0.01; 

for (NSInteger index = 0; index < layers.count; index++) { 
    CALayer *layer = [layers objectAtIndex:index]; 

    CABasicAnimation *zoomOut = [CABasicAnimation animationWithKeyPath:@"zPosition"]; 
    zoomOut.toValue = [NSNumber numberWithDouble:400.0]; 
    zoomOut.beginTime = index * startOffset; 

    CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.animations = [NSArray arrayWithObject:zoomOut]; 
    group.delegate = self; 

    [layer addAnimation:group forKey:@"zoomAway"]; 
} 
+0

मैं इसके जवाब के लिए उच्च और निम्न भी देख रहा हूं, और विभिन्न विभिन्न चीजों की कोशिश की। मैंने सोचा कि एक साझा CAAnimationGroup बनाना संभव होगा कि सभी परत संदर्भ समय सीमा के रूप में साझा कर सकें, लेकिन यह स्पष्ट रूप से काम नहीं करता है। अब मुझे लगता है कि यह शायद इसके बारे में जाने का तरीका है, लेकिन इसमें दूसरों से अधिक अंतर्दृष्टि के साथ सुनना भी अच्छा लगेगा। – Felixyz

0

अपने परिणामों को साझा करने के लिए धन्यवाद, मैं भी पता चला कि BeginTime संपत्ति यदि एक समूह के बिना इस्तेमाल काम नहीं करता।

मेरे मामले में, सीएबीएसिक एनीमेशन पर सेट होने पर स्टार्टटाइम और अवधि जैसी कुछ सेटिंग्स को अनदेखा कर दिया गया था, लेकिन सीधे सीएएनिमेशन समूह सेट करते समय काम किया गया।

14

मुझे पता चला है कि शुरुआती समय संपत्ति एनीमेशन को समूह में डाले बिना काम करती है यदि आप क्वार्ट्जकोर के सीएसीयूआरेंटएमडियाटाइम() फ़ंक्शन द्वारा दिए गए मान से डेल्टा के रूप में मानते हैं।

उदा anim.beginTime = CACurrentMediaTime() + 0.05;

+0

ठंडा। मुझे यह याद रखना याद नहीं है कि जब मैंने इसे मूल रूप से किया था। –

5

काश मैं टिप्पणी करने के लिए प्रतिनिधि, लेकिन कारण यह है कि (CACurrentMediaTime को anim.beginTime की स्थापना) काम करता है कुछ अन्य डॉक्स द्वारा पता चला है था:

AVCoreAnimationBeginTimeAtZero उपयोग इस निरंतर CoreAnimation की एनीमेशन beginTime गुण सेट करने के लिए समय 0 स्थिर एक छोटा, गैर-शून्य, सकारात्मक मान है जो CoreAnimation को 0.0 को CACurrentMediaTime के साथ बदलने से रोकता है। आईओएस 4.0 और बाद में उपलब्ध है। AVAnimation.h में घोषित किया गया।

तो स्टार्टटाइम 0 की सामान्य सेटिंग इसे CACurrentMediaTime() पर सेट करने के लिए कम है। तो आप विभिन्न समूहों की शुरुआत को रोकने के लिए उपयोग कर सकते हैं।

+0

"इसलिए स्टार्टटाइम से 0 की सामान्य सेटिंग इसे CACurrentMediaTime()" पर सेट करने के लिए कम है, वाह, इस स्पष्टीकरण के लिए पूरी तरह से देख रहे हैं, बहुत बहुत धन्यवाद। – langtutheky

0

स्विफ्ट 3

बाहर कर देता है तो आप निम्न करके अपेक्षाकृत बस ऐसा कर सकते हैं: CALayer या CAShapeLayer

var timeOffset:Double = 0 
let delay:Double = 0.1 
for layer in layers { 
    let a = CABasicAnimation(keyPath: "path" 
    a.fromValue = layer.ovalPathSmall.cgPath 
    a.toValue = layer.ovalPathLarge.cgPath 
    a.fillMode = kCAFillModeForwards 
    a.beginTime = CACurrentMediaTime() + timeOffset 
    a.duration = 0.3 
    a.isRemovedOnCompletion = true 
    layer.add(a, forKey: nil) 

    timeOffset += 0.3 + delay 
} 

सभी परतों रहे हैं, और मामले में आप सोच रहे हैं कि क्या ovalPathSmall और ovalPathLarge हैं:

ovalPathSmall = UIBezierPath(arcCenter: position, radius: smallRadius, startAngle: 0, endAngle: 2 * .pi, clockwise: true) 
ovalPathLarge = UIBezierPath(arcCenter: position, radius: largeRadius, startAngle: 0, endAngle: 2 * .pi, clockwise: true) 
संबंधित मुद्दे