2010-06-06 13 views
36

किसी ठोस रंग से एक रास्ता भरने आसान पर्याप्त है:drawRect में ढाल के साथ पथ कैसे भरें :?

CGPoint aPoint; 
for (id pointValue in points) 
{ 
    aPoint = [pointValue CGPointValue]; 
    CGContextAddLineToPoint(context, aPoint.x, aPoint.y); 
} 
[[UIColor redColor] setFill]; 
[[UIColor blackColor] setStroke]; 
CGContextDrawPath(context, kCGPathFillStroke); 

मैं पूरी तरह से लाल के बजाय एक ढाल आकर्षित करने के लिए चाहते हैं, लेकिन मैं परेशानी हो रही हूँ। Gradients on UIView and UILabels On iPhone

जो है:

CAGradientLayer *gradient = [CAGradientLayer layer]; 
[gradient setFrame:rect]; 
[gradient setColors:[NSArray arrayWithObjects:(id)[[UIColor blueColor] CGColor], 
       (id)[[UIColor whiteColor] CGColor], nil]]; 
[[self layer] setMasksToBounds:YES]; 

[[self layer] insertSublayer:gradient atIndex:0]; 

हालांकि, इस पूरे विचार है कि इस ढाल के साथ में है, अपने मूल पथ को कवर पेंट मैं में प्रश्न/उत्तर सूचीबद्ध कोड की कोशिश की है।

उत्तर

89

मैं उस पथ पर क्लिप करूंगा जिसे आप भरना चाहते हैं, और CGContextDrawLinearGradient का उपयोग करें। यहां drawRect का एक सरल कार्यान्वयन है: उदाहरण के रूप में:

- (void) drawRect:(CGRect)rect 
{ 
    // Create a gradient from white to red 
    CGFloat colors [] = { 
     1.0, 1.0, 1.0, 1.0, 
     1.0, 0.0, 0.0, 1.0 
    }; 

    CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2); 
    CGColorSpaceRelease(baseSpace), baseSpace = NULL; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSaveGState(context); 
    CGContextAddEllipseInRect(context, rect); 
    CGContextClip(context); 

    CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
    CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 

    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 
    CGGradientRelease(gradient), gradient = NULL; 

    CGContextRestoreGState(context); 

    CGContextAddEllipseInRect(context, rect); 
    CGContextDrawPath(context, kCGPathStroke); 
} 
+1

यदि मैं आपको एक शानदार बैज दे सकता हूं तो मैं चाहता हूं! क्या आप CGContextSaveGState और सामान पर किसी भी ट्यूटोरियल के बारे में जानते हैं? क्योंकि सेब वर्ग संदर्भ पतला है। – Derrick

+0

डेरिक: क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड उस सब कुछ के साथ कवर करता है: http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html#//apple_ref/doc/ uid/TP30001066-CH202-TPXREF132 –

+1

अपना उदाहरण कोड उपयोग करने के बाद, मेरी छाया गायब हो गई है। मैंने छाया रेखा को स्थानांतरित करने का प्रयास किया है ("CGContextSetShadow (संदर्भ, CGSizeMake (5.0, -5.0), 4);") gstate से पहले सहेजने से पहले, इसके बाद, gstate पुनर्स्थापित करें, इसके बाद, क्लिपिंग के पहले और बाद में कुछ भी नहीं - कुछ भी नहीं मदद की। – Doron