2010-06-06 4 views
36

remplir un chemin avec une couleur unie est assez facile:Comment remplir un chemin avec un dégradé dans 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); 

Je voudrais dessiner un gradient au lieu de rouge solide, mais je ne parviens pas à. J'ai essayé le code figurant dans la Question/Réponse: Gradients on UIView and UILabels On iPhone

qui est:

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

Cependant, ce peint toute la vue que ce soit avec la pente, couvrant mon chemin original.

Répondre

89

Je tracerais sur le chemin que vous souhaitez remplir et utiliser CGContextDrawLinearGradient. Voici une implémentation simple de drawRect: à titre d'exemple:

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

Si je pouvais vous donner un badge génial je le ferais! Connaissez-vous des tutoriels sur le CGContextSaveGState et d'autres choses? Parce que la référence de la classe Apple est plutôt mince. – Derrick

+0

Derrick: Le Guide de programmation 2D Quartz couvre cela, avec tout le reste: http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html#//apple_ref/doc/ uid/TP30001066-CH202-TPXREF132 –

+1

Après avoir utilisé votre exemple de code, mon ombre a disparu. J'ai essayé de déplacer la ligne d'ombre ("CGContextSetShadow (contexte, CGSizeMake (5.0, -5.0), 4);") avant l'enregistrement de gstate, après cela, befroe la restauration de gstate, après, avant et après le découpage - rien aidé. – Doron

Questions connexes