2012-03-19 16 views
9

द्वारा बनाई गई छाया छायाएं मैं एक होलो CGPath के बाहरी किनारे के चारों ओर एक छाया जोड़ना चाहता हूं (उन दो शब्द महत्वपूर्ण हैं: बाहर + खोखले :))।CALayer.shadow

ऐप्पल की छाया क्रियान्वयन केवल आपको "भरी" छाया करने की अनुमति देता है।

तो ... छाया के अंदर के हिस्से को कैसे बंद करना है? अगर यह रेंडर कॉल था, तो मैं इसे क्लिप करने के लिए CGContextSetClip * विधियों को कॉल करने के लिए कहूंगा ... लेकिन मैं नहीं देख सकता कि आप इसे कैसे प्राप्त करेंगे, क्योंकि यह न तो एक रेंडर कॉल है, न ही एक कैलियर स्वयं ।

(एप्पल का एक दुर्भाग्यपूर्ण परिणाम यह जादू चर का एक सेट के रूप में "छिपा", मुझे लगता है?)

एनबी: इस आईओएस है केवल - IIRC मैक पर आप छाया बनाने के लिए इस्तेमाल फिल्टर करने के लिए सीधी पहुँच है , ताकि आप हाथ से अपनी खुद की (मनमानी) छाया बना सकें।


अद्यतन:

मैं बाहर काम किया छाया का ही भीतरी भाग को दिखाने के लिए क्लिप के लिए कैसे: "layer.mask" सेट, एक नई परत वर्तमान परत का एक क्लोन है कि होने के लिए (यानी एक ही रास्ता), और पूर्ण अल्फा के साथ पथ fillcolor सेट करें।

यह मैं जो कोशिश कर रहा हूं उसके विपरीत यह है, इसलिए यदि मैं मास्क परत को अल्फा फ्लिप करने के लिए एक रास्ता प्राप्त कर सकता हूं (0 हो जाता है, 1 हो जाता है 0), तो मैं वहां रहूंगा ...

उत्तर

5

आप मान लिया जाये कि एक विधि है:

-(CAShapeLayer*) cloneShapeLayer; // creates a new CAShapeLayer and copies the values 

... तो ऐसा करते हैं:

  1. कॉपी परत, "नकाब"
  2. लें मुखौटा बनाने - एक ही CGPath, याद है - और की जगह अपने देहात एक रास्ता है कि साथ th:
    1. पूरी परत
    2. माइनस मूल पथ
    3. (ईओ नियम का उपयोग करके प्राप्त)
  3. मूल परत का मुखौटा सेट की रेक्ट (

    CAShapeLayer* maskLayer = [originalLayer cloneShapeLayer]; 
    // got to make it a bit bigger if your original path reaches to the edge 
    // since the shadow needs to stretch "outside" the frame: 
    CGFloat shadowBorder = 50.0; 
    maskLayer.frame = CGRectInset(maskLayer.frame, - shadowBorder, - shadowBorder); 
        maskLayer.frame = CGRectOffset(maskLayer.frame, shadowBorder/2.0, shadowBorder/2.0); 
    maskLayer.fillColor = [UIColor blackColor].CGColor; 
    maskLayer.lineWidth = 0.0; 
    maskLayer.fillRule = kCAFillRuleEvenOdd; 
    
    CGMutablePathRef pathMasking = CGPathCreateMutable(); 
    CGPathAddPath(pathMasking, NULL, [UIBezierPath bezierPathWithRect:maskLayer.frame].CGPath); 
    CGAffineTransform catShiftBorder = CGAffineTransformMakeTranslation(shadowBorder/2.0, shadowBorder/2.0); 
    CGPathAddPath(pathMasking, NULL, CGPathCreateCopyByTransformingPath(maskLayer.path, &catShiftBorder)); 
    maskLayer.path = pathMasking; 
    
    shapeLayer.mask = maskLayer; 
    
    : छाया के साथ) नई परत "मुखौटा"

यानी कोड में होना

एनबी: यह वास्तव में काम करता है, सिवाय इसके कि जब छाया मास्किंग नहीं कर रही थी, तब की तुलना में छाया थोड़ी बढ़ी है। ओह अच्छा।

+0

मैंने कोशिश की, लेकिन मेरी परत से कुछ भी नहीं हुआ, और आपने 'छायाबॉर्डरविड्थ' को परिभाषित नहीं किया। इसका क्या मतलब है? –

+0

मैंने कोड बदल दिया है। मुझे नहीं पता कि यह अभी भी काम करेगा, शायद होगा। यदि यह आपके लिए काम नहीं करता है, तो आपके पास ऐसा करने के लिए बहुत कुछ डिबगिंग है: आपकी क्लोनशिपलेयर विधि, आपके सीजीपाथ में आपका घुमावदार नियम, आपका मूल CGPath स्वयं, आदि ... यह आपके स्रोत कोड और आपके छवि डेटा पर बहुत निर्भर है - मैं आपके लिए इसे डीबग नहीं कर सकता। – Adam

+0

धन्यवाद, मैं इसे आजमाउंगा :) –

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

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