किसी और के लिए सोच रहा था कि कॉस्टयूम सुझाव के अनुसार कोर ग्राफिक्स का उपयोग करके एक आंतरिक छाया कैसे खींचना है, तो यह है कि: (आईओएस समायोजन आवश्यकतानुसार)
आपके ड्राअर में: विधि ...
CGRect bounds = [self bounds];
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat radius = 0.5f * CGRectGetHeight(bounds);
// Create the "visible" path, which will be the shape that gets the inner shadow
// In this case it's just a rounded rect, but could be as complex as your want
CGMutablePathRef visiblePath = CGPathCreateMutable();
CGRect innerRect = CGRectInset(bounds, radius, radius);
CGPathMoveToPoint(visiblePath, NULL, innerRect.origin.x, bounds.origin.y);
CGPathAddLineToPoint(visiblePath, NULL, innerRect.origin.x + innerRect.size.width, bounds.origin.y);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, bounds.origin.y, bounds.origin.x + bounds.size.width, innerRect.origin.y, radius);
CGPathAddLineToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, innerRect.origin.y + innerRect.size.height);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, bounds.origin.y + bounds.size.height, innerRect.origin.x + innerRect.size.width, bounds.origin.y + bounds.size.height, radius);
CGPathAddLineToPoint(visiblePath, NULL, innerRect.origin.x, bounds.origin.y + bounds.size.height);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x, bounds.origin.y + bounds.size.height, bounds.origin.x, innerRect.origin.y + innerRect.size.height, radius);
CGPathAddLineToPoint(visiblePath, NULL, bounds.origin.x, innerRect.origin.y);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x, bounds.origin.y, innerRect.origin.x, bounds.origin.y, radius);
CGPathCloseSubpath(visiblePath);
// Fill this path
UIColor *aColor = [UIColor redColor];
[aColor setFill];
CGContextAddPath(context, visiblePath);
CGContextFillPath(context);
// Now create a larger rectangle, which we're going to subtract the visible path from
// and apply a shadow
CGMutablePathRef path = CGPathCreateMutable();
//(when drawing the shadow for a path whichs bounding box is not known pass "CGPathGetPathBoundingBox(visiblePath)" instead of "bounds" in the following line:)
//-42 cuould just be any offset > 0
CGPathAddRect(path, NULL, CGRectInset(bounds, -42, -42));
// Add the visible path (so that it gets subtracted for the shadow)
CGPathAddPath(path, NULL, visiblePath);
CGPathCloseSubpath(path);
// Add the visible paths as the clipping path to the context
CGContextAddPath(context, visiblePath);
CGContextClip(context);
// Now setup the shadow properties on the context
aColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f];
CGContextSaveGState(context);
CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 1.0f), 3.0f, [aColor CGColor]);
// Now fill the rectangle, so the shadow gets drawn
[aColor setFill];
CGContextSaveGState(context);
CGContextAddPath(context, path);
CGContextEOFillPath(context);
// Release the paths
CGPathRelease(path);
CGPathRelease(visiblePath);
तो, अनिवार्य रूप से निम्नलिखित चरण हैं:
- अपना रास्ता बनाएं
- इच्छित रंग भरें, इस पथ को संदर्भ में जोड़ें, और संदर्भ भरें
- अब एक बड़ा आयत बनाएँ जो दृश्य पथ को बाध्य कर सके। इस पथ को बंद करने से पहले, दृश्य पथ जोड़ें। फिर पथ को बंद करें, ताकि आप इसे से घटाए गए दृश्य पथ के साथ एक आकृति बनाएं। आप इन विधियों को बनाने के तरीके के आधार पर भरण विधियों (सम-विषम की गैर-शून्य वाइंडिंग) की जांच करना चाह सकते हैं। संक्षेप में, जब आप उन्हें एक साथ जोड़ते हैं, तो "सबट्रेक्ट" करने के लिए उपप्रकारों को प्राप्त करने के लिए, आपको उन्हें विपरीत दिशाओं में, एक घड़ी की दिशा में और दूसरे एंटी-क्लॉकवाइज़ को खींचना होगा।
- फिर आपको अपने दृश्य पथ को संदर्भ पर क्लिपिंग पथ के रूप में सेट करने की आवश्यकता है, ताकि आप इसे स्क्रीन के बाहर कुछ भी आकर्षित न करें।
- फिर संदर्भ पर छाया को सेटअप करें, जिसमें ऑफसेट, ब्लर और रंग शामिल हैं।
- फिर इसमें छेद के साथ बड़े आकार को भरें। रंग मायने नहीं रखता, क्योंकि अगर आपने सब कुछ सही किया है, तो आप इस रंग को सिर्फ छाया नहीं देखेंगे।