2011-09-04 6 views
2

Je suis sur le point de commencer à m'arracher les cheveux. J'essaye de créer un remplissage de gradient couvrant la région du rectangle avec les coins arrondis. Ceci est le code que j'ai dans mon drawRect::Quartz: impossible de créer un rectangle arrondi avec remplissage dégradé

CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextClearRect(ctx, rect); 

CGFloat c = BUBBLE_INSET + BUBBLE_CORNER_RADIUS; 

CGContextMoveToPoint(ctx, BUBBLE_INSET, c); 

CGContextAddArcToPoint(ctx, BUBBLE_INSET, BUBBLE_INSET, c, BUBBLE_INSET, BUBBLE_CORNER_RADIUS);  
CGContextAddLineToPoint(ctx, rect.size.width - c, BUBBLE_INSET); 
CGContextAddArcToPoint(ctx, rect.size.width - BUBBLE_INSET, BUBBLE_INSET, rect.size.width - BUBBLE_INSET, c, BUBBLE_CORNER_RADIUS); 
CGContextAddLineToPoint(ctx, rect.size.width - BUBBLE_INSET, rect.size.height - c); 
CGContextAddArcToPoint(ctx, rect.size.width - BUBBLE_INSET, rect.size.height - BUBBLE_INSET, rect.size.width - c, rect.size.height - BUBBLE_INSET, BUBBLE_CORNER_RADIUS); 
CGContextAddLineToPoint(ctx, c, rect.size.height - BUBBLE_INSET); 
CGContextAddArcToPoint(ctx, BUBBLE_INSET, rect.size.height - BUBBLE_INSET, BUBBLE_INSET, rect.size.height - c, BUBBLE_CORNER_RADIUS); 

CGContextClosePath(ctx); 

CGContextClip(ctx); 

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 
NSArray *colors = [NSArray arrayWithObjects:color1, color2, nil]; 

CGGradientRef gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, NULL); 
CGColorSpaceRelease(space); 

CGPoint p1 = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
CGPoint p2 = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 

CGContextDrawLinearGradient(ctx, gradient, p1, p2, 0); 
CGGradientRelease(gradient); 

Ce code dessine un rectangle blanc vide. Chemin est construit correctement (j'ai essayé d'appeler CGContextFillPath() et le résultat est joliment rempli de couleur unie), color1 et color2 les valeurs sont correctes (vu dans le débogueur). Quel est le problème avec ce code?

+2

Etes-vous sûr que color1 et color2 sont définis dans RVB-Space. c'est-à-dire [[UIColor blackColor] CGColor] renvoie une couleur espacée monochrome. – vikingosegundo

+0

Il s'est avéré que color1 et color2 sont de type UIColor, ce qui est totalement faux. Ajout de l'invocation 'CGColor' si nécessaire et les choses fonctionnent maintenant –

+0

Cela peut être assez déroutant. – vikingosegundo

Répondre

0

Il est avéré que color1 et couleur2 étaient de type UIColor, ce qui est totalement faux. Changement de la ligne

NSArray *colors = [NSArray arrayWithObjects:color1, color2, nil]; 

à

NSArray *colors = [NSArray arrayWithObjects:[color1 CGColor], [color2 CGColor], nil]; 

et a obtenu le résultat que je me attendais.

2

Je ne suis pas sûr de savoir comment vos couleurs sont enveloppées le tableau de couleurs.

Essayez d'utiliser

CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

à la place.

CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextClearRect(ctx, rect); 

CGFloat c = BUBBLE_INSET + BUBBLE_CORNER_RADIUS; 

CGContextMoveToPoint(ctx, BUBBLE_INSET, c); 

CGContextAddArcToPoint(ctx, BUBBLE_INSET, BUBBLE_INSET, c, BUBBLE_INSET, BUBBLE_CORNER_RADIUS);  
CGContextAddLineToPoint(ctx, rect.size.width - c, BUBBLE_INSET); 
CGContextAddArcToPoint(ctx, rect.size.width - BUBBLE_INSET, BUBBLE_INSET, rect.size.width - BUBBLE_INSET, c, BUBBLE_CORNER_RADIUS); 
CGContextAddLineToPoint(ctx, rect.size.width - BUBBLE_INSET, rect.size.height - c); 
CGContextAddArcToPoint(ctx, rect.size.width - BUBBLE_INSET, rect.size.height - BUBBLE_INSET, rect.size.width - c, rect.size.height - BUBBLE_INSET, BUBBLE_CORNER_RADIUS); 
CGContextAddLineToPoint(ctx, c, rect.size.height - BUBBLE_INSET); 
CGContextAddArcToPoint(ctx, BUBBLE_INSET, rect.size.height - BUBBLE_INSET, BUBBLE_INSET, rect.size.height - c, BUBBLE_CORNER_RADIUS); 

CGContextClosePath(ctx); 

CGContextClip(ctx); 

CGGradientRef gradient; 
CGColorSpaceRef rgbColorspace; 
size_t num_locations = 2; 
CGFloat locations[2] = { 0.0, 1.0 }; 
CGFloat components[8] = { 1.0, 0.0, 0.0, 1.0, // Start color 
    1.0, 1.0, 1.0, 0.65 }; // End color 

rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
gradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

CGPoint p1 = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
CGPoint p2 = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 

CGContextDrawLinearGradient(ctx, gradient, p1, p2, 0); 
CGGradientRelease(gradient); 

Vous obtiendrez ceci:

offset a été 5,0 rayon était 10,0

enter image description here

Questions connexes