2010-06-06 7 views
36

riempire un percorso con un colore solido è abbastanza facile:Come riempire un tracciato con gradiente in 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); 

mi piacerebbe disegnare un gradiente invece di rosso solido, ma sto avendo difficoltà. ho provato il codice elencato nella Domanda/Risposta: Gradients on UIView and UILabels On iPhone

quali è:

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]; 

Tuttavia, questo dipinge l'intera vista che si tratta con il gradiente, che copre il mio percorso originale.

risposta

89

Fare clic sul percorso che si desidera riempire e utilizzare CGContextDrawLinearGradient. Ecco una semplice implementazione di drawRect: ad esempio:

- (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

Se potessi darti un distintivo fantastico lo farei! Conosci qualche tutorial su CGContextSaveGState e cose del genere? Perché il riferimento alla classe delle mele è piuttosto sottile. – Derrick

+0

Derrick: The Quartz 2D Programming Guide copre tutto ciò, insieme a tutto il resto: http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html#//apple_ref/doc/ uid/TP30001066-CH202-TPXREF132 –

+1

Dopo aver utilizzato il codice di esempio, la mia ombra è scomparsa. Ho provato a spostare la linea d'ombra ("CGContextSetShadow (context, CGSizeMake (5.0, -5.0), 4);") prima del salvataggio di gstate, dopo di esso, prima del ripristino di gstate, dopo di esso, prima e dopo il ritaglio - niente aiutato. – Doron