2011-12-13 12 views
6

मेरे पास CALayers का संग्रह है। प्रत्येक परत एक ही पैरेंट CALayer का एक उपन्यास है, और प्रत्येक के पास एक छाया लागू होती है। परतों को गतिशील रूप से तैनात किया जाता है, और उनमें से कई हैं, इसलिए मैं भविष्यवाणी नहीं कर सकता कि उन्हें समय से पहले कैसे व्यवस्थित किया जाएगा।क्या कैलेयर छाया को आसन्न परतों को ओवरलैप करने से रोकने का कोई तरीका है?

यदि परतें एक दूसरे के समीप हैं (पर्याप्त करीब है कि वे लगभग छू रहे हैं) CALayers में से एक की छाया अन्य CALayer के शीर्ष पर प्रदान की जाती है। यह शायद ज्यादातर मामलों में वांछित प्रभाव है, लेकिन मैं चाहता हूं कि मेरी परतें एक ही जेड-प्लेन में मौजूद हों। (इसका एक उदाहरण CSS3 वेब डिज़ाइन में ब्लॉक तत्वों पर छाया लागू होती है।)

क्या यह संभव है? इसे कैसे प्राप्त किया जा सकता है?

(मुझे यह विचार था: प्रत्येक CALayer पर अपनी छाया छवि के साथ 'छाया' सबबेलर जोड़ना, और जेड-स्थिति को कम मूल्य पर सेट करना। लेकिन क्या परत-पेड़ इसे असंभव बना देता है? Z- एक परत की समन्वय प्रणाली में स्थितियां किसी अन्य परत के समन्वय प्रणाली में जेड-पोजिशन से स्वतंत्र हैं, है ना?)

उत्तर

16

यदि सभी छायांकित परतों में एक ही छाया सेटिंग्स हैं, तो उन्हें एक कंटेनर परत में रखें और कंटेनर पर छाया सेट करें परत। उदाहरण:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CALayer *containerLayer = [CALayer layer]; 
    containerLayer.frame = self.view.bounds; 
    containerLayer.shadowRadius = 10; 
    containerLayer.shadowOpacity = 1; 
    [self.view.layer addSublayer:containerLayer]; 

    CAShapeLayer *layer1 = [CAShapeLayer layer]; 
    layer1.bounds = CGRectMake(0, 0, 200, 200); 
    layer1.position = CGPointMake(130, 130); 
    layer1.path = [UIBezierPath bezierPathWithOvalInRect:layer1.bounds].CGPath; 
    layer1.fillColor = [UIColor redColor].CGColor; 
    [containerLayer addSublayer:layer1]; 

    CAShapeLayer *layer2 = [CAShapeLayer layer]; 
    layer2.bounds = CGRectMake(0, 0, 200, 200); 
    layer2.position = CGPointMake(170, 200); 
    layer2.path = [UIBezierPath bezierPathWithOvalInRect:layer2.bounds].CGPath; 
    layer2.fillColor = [UIColor blueColor].CGColor; 
    [containerLayer addSublayer:layer2]; 
} 

आउटपुट:

overlapping circles with unified shadow

+0

वाह, धन्यवाद! यह हिंडसाइट में इतना स्पष्ट है। विचार मेरे साथ हुआ, लेकिन मुझे लगा कि यह कंटेनर परत (जो भी है, हाहा) के आकार में एक छाया लागू किया होगा। –

+1

+1 उत्कृष्ट उत्तर – occulus

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

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