2011-01-19 20 views
29

क्या किसी को किसी कैशपलेयर को ग्रेडियेंट लगाने में कोई अनुभव है? CAShapeLayer एक शानदार परत वर्ग है, लेकिन ऐसा लगता है कि यह केवल ठोस भरने के रंग का समर्थन करता है, जबकि मैं इसे ढाल भरना चाहता हूं (वास्तव में उस पर एक एनिमेटेबल ढाल)।CAShapeLayer को ग्रेडियेंट लागू करना

कैशपलेयर (छाया, आकार, स्ट्रोक रंग, एनिमेटेबल आकृति पथ) के साथ सब कुछ करने के लिए शानदार है।

मैंने एक सीएएसएआरएपीएएलएयर के अंदर एक कैग्रेडिएंटियर लगाने की कोशिश की है, या वास्तव में सीएएसएचएपीएलएयर को ग्रेडियंटलेयर के मुखौटा के रूप में सेट करना और दोनों को कंटेनर परत में जोड़ना है, लेकिन इनके पास सही परिणाम नहीं है।

क्या मुझे कैशपलेयर को उपclass करना चाहिए, या क्या कोई बेहतर तरीका आगे है?

धन्यवाद।

+0

मेरा मानना ​​है कि [इस सवाल] (http://stackoverflow.com/questions/1303855/how-to-draw-a-gradient-line-fading-in-out-with-core-graphics-iphone) में [मैट लांग द्वारा उत्तर] शामिल है (http://stackoverflow.com/questions/1303855/how-to-draw-a-gradient-line-fading-in-out-with-core-graphics-iphone/1303943# 1,303,943)। – Palimondo

उत्तर

53

आप अपने आकार के पथ का उपयोग एक मास्किंग परत बनाने के लिए कर सकता है और ढाल परत पर लागू होते हैं कि, इस तरह:

UIView *v = [[UIView alloc] initWithFrame:self.window.frame]; 

CAShapeLayer *gradientMask = [CAShapeLayer layer]; 
gradientMask.fillColor = [[UIColor clearColor] CGColor]; 
gradientMask.strokeColor = [[UIColor blackColor] CGColor]; 
gradientMask.lineWidth = 4; 
gradientMask.frame = CGRectMake(0, 0, v.bounds.size.width, v.bounds.size.height); 

CGMutablePathRef t = CGPathCreateMutable();  
CGPathMoveToPoint(t, NULL, 0, 0); 
CGPathAddLineToPoint(t, NULL, v.bounds.size.width, v.bounds.size.height); 

gradientMask.path = t; 


CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
gradientLayer.startPoint = CGPointMake(0.5,1.0); 
gradientLayer.endPoint = CGPointMake(0.5,0.0); 
gradientLayer.frame = CGRectMake(0, 0, v.bounds.size.width, v.bounds.size.height); 
NSMutableArray *colors = [NSMutableArray array]; 
for (int i = 0; i < 10; i++) { 
    [colors addObject:(id)[[UIColor colorWithHue:(0.1 * i) saturation:1 brightness:.8 alpha:1] CGColor]]; 
} 
gradientLayer.colors = colors; 

[gradientLayer setMask:gradientMask]; 
[v.layer addSublayer:gradientLayer]; 

आप भी छाया का उपयोग करना चाहते हैं, तो आप एक जगह करने के लिए होगा ढाल परत के नीचे आकृति परत के "डुप्लिकेट", एक ही पथ संदर्भ रीसाइक्लिंग।

+2

यह एक अद्भुत जवाब है। उन लोगों के लिए जिन्हें इस बारे में पता नहीं है (जैसे मैं था), मैं यह जोड़ना चाहता हूं कि आप मुखौटा, ढाल, छाया और किसी भी अन्य परतों को जोड़ सकते हैं जिन्हें आपको कंटेनर परत ('कैलियर कंटेनर = [कैलियर परत] ') और उसके बाद आपको केवल उस कंटेनर परत को प्रबंधित करना होगा यदि आपको इसकी स्थिति को एनिमेट करने की आवश्यकता है। –

+0

महान जवाब! धन्यवाद! – user5685969

2

यह एक अच्छा समाधान है, लेकिन यदि आप CAShapeLayer पर एक श्रेणी बना रहे हैं तो आपको अप्रत्याशित समस्याएं आ सकती हैं जहां आपको तुरंत दृश्य नहीं दिखाई देता है।

, Setting correct frame of a newly created CAShapeLayer

निष्कर्ष देखें प्राप्त पथ की सीमा तो पथ सीमा का उपयोग करने और आवश्यक के रूप में अनुवाद कर ढाल मुखौटा के फ्रेम निर्धारित किया है। यहां अच्छी बात यह है कि किसी भी अन्य फ्रेम की बजाय पथ की सीमाओं का उपयोग करके, ढाल केवल पथ सीमाओं के भीतर फिट होगा (मान लीजिए कि आप यही चाहते हैं)।

// Category on CAShapeLayer 

CGRect pathBounds = CGPathGetBoundingBox(self.path); 

CAShapeLayer *gradientMask = [CAShapeLayer layer]; 
gradientMask.fillColor = [[UIColor blackColor] CGColor]; 
gradientMask.frame = CGRectMake(0, 0, pathBounds.size.width, pathBounds.size.height); 
gradientMask.path = self.path; 

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
gradientLayer.startPoint = CGPointMake(0.5,1.0); 
gradientLayer.endPoint = CGPointMake(0.5,0.0); 
gradientLayer.frame = CGRectMake(0, 0, pathBounds.size.width, pathBounds.size.height); 

NSMutableArray *colors = [NSMutableArray array]; 
for (int i = 0; i < 10; i++) { 
    [colors addObject:(id)[[UIColor colorWithHue:(0.1 * i) saturation:1 brightness:.8 alpha:1] CGColor]]; 
} 
gradientLayer.colors = colors; 

[gradientLayer setMask:gradientMask]; 
[self addSublayer:gradientLayer];