2012-08-12 11 views
6

मैं CALayer के लिए छाया पथ एनिमेट कर रहा हूं।एक कैलियर छायापाथ एनिमेटिंग

फ्रेम सही ढंग से आकार बदलता है, लेकिन छाया स्केल नहीं होती है।

इसके बजाय छाया अंतिम आकार CGSize(20,20) पर शुरू होता है और एनीमेशन के दौरान आयोजित करता है, भले ही मैं shadowPath एक प्रारंभिक मूल्य

[CATransaction begin]; 
[CATransaction setAnimationDuration: 0]; 
[CATransaction setDisableActions: TRUE]; 
    layer.frame = CGRectMake(0,0,10,10); 
    layer.shadowPath = [UIBezierPath bezierPathWithRect:layer.bounds].CGPath; 
[CATransaction commit]; 

[CATransaction begin]; 

    [CATransaction setValue:[NSNumber numberWithFloat:10] forKey:kCATransactionAnimationDuration]; 
    layer.frame = CGRectMake(0,0,20,20); 
    layer.shadowPath = [UIBezierPath bezierPathWithRect:tile.bounds].CGPath; 

[CATransaction commit]; 

उत्तर

9

करने पर पहले ड्रॉप छाया के साथ छोटे वर्ग सेट,।

ss

जब बटन धक्का दिया, वर्ग और छाया एक साथ बड़ा हो जाना।

ss

मुख्य कोड के नीचे है:

[CATransaction begin]; 
[CATransaction setAnimationDuration:5.0]; 
CAMediaTimingFunction *timing = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
[CATransaction setAnimationTimingFunction:timing]; 
layer.frame = CGRectMake(0,0,100,100); 
[CATransaction commit];  

CABasicAnimation *shadowAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"]; 
shadowAnimation.duration = 5.0; 
shadowAnimation.fromValue = (id)[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 50, 50)].CGPath; 
shadowAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)].CGPath; 
[layer addAnimation:shadowAnimation forKey:@"shadow"]; 

आप GitHub से इस परियोजना डाउनलोड कर सकते हैं और बस इसे चलाते हैं।

https://github.com/weed/p120812_CALayerShadowTest

यह सवाल मेरे लिए बहुत मुश्किल था! :)

+0

प्रयास के लिए धन्यवाद। क्या आप मुझे बता सकते हैं कि मेरा समाधान क्यों काम नहीं करता है? आप फ्रेम को एनिमेट क्यों कर सकते हैं लेकिन छाया पथ नहीं? – prostock

+0

छाया एनीमेशन का बिंदु 'एनीमेशन WithKeyPath' को' छाया "के रूप में सेट करना है। इसका मतलब है कि एनीमेशन का उद्देश्य 'छायापाथ' है। मुझे यह तंत्र भी नहीं पता था, लेकिन सेटिंग 'एनीमेशन विथकेपथ' एनीमेशन बनाने के लिए बहुत महत्वपूर्ण है। यह ठीक है ? – weed

3

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

[CATransaction begin]; 

[CATransaction setValue:[CAMediaTimingFunction 
    functionWithName:kCAMediaTimingFunctionEaseOut] 
    forKey:kCATransactionAnimationTimingFunction]; 

for (CALayer *layer in self.layers){ 
    CABasicAnimation *shadowAnimation = 
    [CABasicAnimation animationWithKeyPath:@"shadowPath"]; 

    shadowAnimation.fromValue = 
     (id)[UIBezierPath bezierPathWithRect:layer.bounds].CGPath; 
    shadowAnimation.timingFunction = 
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
    layer.frame = rectFinal; 
    shadowAnimation.toValue = 
     (id)[UIBezierPath bezierPathWithRect:layer.bounds].CGPath; 
    layer.shadowPath = 
     [UIBezierPath bezierPathWithRect:layer.bounds].CGPath; 
    [layer addAnimation:shadowAnimation forKey:nil]; 
}   
[CATransaction commit];