2012-07-13 54 views
17

एनिमेट नहीं करता है मैं सामान्य कोनों से गोलाकार कोनों तक एक कैलियर के संक्रमण को एनीमेशन करने की कोशिश कर रहा हूं। मैं केवल शीर्ष कोनों को गोल करना चाहता हूं, इसलिए मैं UIBezierPath का उपयोग कर रहा हूं। कोड यह रहा:कैलासिक पथ के साथ CABasicAnimation

UIRectCorner corners = UIRectCornerTopLeft | UIRectCornerTopRight; 

UIBezierPath* newPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(8.0f, 8.0f)]; 
UIBezierPath* oldPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(0.0f, 0.0f)]; 

CAShapeLayer* layer = [CAShapeLayer layer]; 
layer.frame = self.bounds; 
layer.path = oldPath.CGPath; 

self.layer.mask = layer; 

CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"path"]; 
[a setDuration:0.4f]; 
[a setFromValue:(id)layer.path]; 
[a setToValue:(id)newPath.CGPath]; 

layer.path = newPath.CGPath; 
[layer addAnimation:a forKey:@"path"]; 

लेकिन जब मैं इस चलाने के लिए, कोने गोल कर रहे हैं, लेकिन कोई animation- यह तुरंत होता है। मैंने SO पर कुछ समान प्रश्न देखे हैं, लेकिन उन्होंने मेरी समस्या का समाधान नहीं किया।

iPhone CALayer animation

Animating CALayer's shadowPath property

मुझे यकीन है कि मैं सिर्फ एक छोटी सी बात गलत कर रहा हूँ जो समस्या का कारण है हूँ, लेकिन मुझे के जीवन के लिए मैं यह समझ नहीं कर सकते हैं।

समाधान:

- (void)roundCornersAnimated:(BOOL)animated { 
    UIRectCorner corners = UIRectCornerTopLeft | UIRectCornerTopRight; 

    UIBezierPath* newPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(8.0f, 8.0f)]; 
    UIBezierPath* oldPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(0.0001f, 0.0001f)]; 

    CAShapeLayer* layer = [CAShapeLayer layer]; 
    layer.frame = self.bounds; 

    self.layer.mask = layer; 

    if(animated) { 
     CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"path"]; 
     [a setDuration:0.4f]; 
     [a setFromValue:(id)oldPath.CGPath]; 
     [a setToValue:(id)newPath.CGPath]; 

     layer.path = newPath.CGPath; 
     [layer addAnimation:a forKey:@"path"]; 
    } else { 
     layer.path = newPath.CGPath; 
    } 
} 

सच सब मुझे क्या करना जरूरत एनीमेशन के लिए मूल्य 'से' एक उचित स्थापित किया गया था।

+1

समाधान सवाल का हिस्सा के बजाय एक जवाब के रूप अच्छा होगा, लेकिन यह वैसे भी उपयोगी तो +1 :) – buildsucceeded

उत्तर

10

ऐसा लगता है कि आप एक आकृति परत बना रहे हैं जिसमें पथ नहीं है, फिर इसे पथ जोड़ने के लिए एनिमेट करने का प्रयास करें। आकार परतें विशेष मामले हैं, और इस तरह से काम नहीं करते हैं।

एनीमेशन से पहले और उसके बाद आपको आकृति परत में पथ होना चाहिए, और रास्ते में पहले और बाद में पथ में समान संख्याएं होनी चाहिए।

आपको 0 के कोने त्रिज्या (मैन्युअल रूप से, पक्षों और कोने आर्कों की एक श्रृंखला का उपयोग करके) के साथ गोलाकार आयताकार पथ बनाना होगा, और उसके बाद कोनों के लिए गैर शून्य त्रिज्या के साथ एक नया पथ बनाना होगा जिसे आप गोल करना चाहते हैं और उस पथ को अपनी एनीमेशन के रूप में स्थापित करें।

यहां तक ​​कि यह काम नहीं कर सकता है, हालांकि, पथ में बिल्कुल उसी अंक की आवश्यकता होती है, और मुझे संदेह है कि त्रिज्या शून्य होने पर आर्क को बिंदुओं को सरल बना दिया जाएगा।

मुझे अभी एक UIBezierPath कॉल मिला है जो एक आयताकार बनायेगा जहां आप चुन सकते हैं कि कौन से कोनों को गोल करना है। कॉल bezierPathWithRoundedRect है: byRoundingCorners: cornerRadii:

यह आपके जैसा पसंद के रूप में कई गोलाकार कोनों के साथ एक आयत बना देगा। हालांकि, मुझे यकीन नहीं है कि यह पथ एनीमेशन के लिए काम करेगा या नहीं। आपको शून्य को त्रिज्या पर सेट किए गए 2 गैर-गोलाकार कोनों के साथ गोलाकार सभी कोनों का अनुरोध करने की आवश्यकता हो सकती है। इस तरह आप एक गोल आयत पथ के रूप में उसी बिंदु के साथ पथ प्राप्त कर सकते हैं ताकि पथ एनीमेशन सही तरीके से काम कर सके। आपको इसे आजमा देना होगा।

+0

धन्यवाद है। तुम सही थे। एनीमेशन के लिए सही 'से' मान सेट करना यह था। –

4

प्रयास डाल करने के लिए:

layer.path = newPath.CGPath; 

के बाद:

[layer addAnimation:a forKey:@"path"]; 

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

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