2011-10-05 3 views
4

Donc, dans ma vue personnalisée, j'essaie de dessiner un dégradé blanc/gris en utilisant Core Graphics. J'ai le code suivant:Dessiner une couleur blanche donne une couleur transparente

UIColor *color1 = [UIColor whiteColor]; 
UIColor *color2 = [UIColor colorWithRed:209.0/255.0 green:212.0/255.0 blue:217.0/255.0 alpha:1.0]; 

CFMutableArrayRef colors = CFArrayCreateMutable(NULL, 0, NULL); 
CFArrayAppendValue(colors, color1.CGColor); 
CFArrayAppendValue(colors, color2.CGColor); 

CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
CGFloat locations[2] = {0.0, 1.0}; 
CGGradientRef gradient = CGGradientCreateWithColors(colorspace, colors, locations); 

CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), gradient, topCenter, bottomCenter, kCGGradientDrawsAfterEndLocation); 

Je pense que ce code est assez simple et devrait se traduire par un gradient blanc/gris agréable. Mais ça ne l'est pas; il dessine un dégradé transparent/gris.

Je pense que cela peut avoir quelque chose à voir avec la couleur de fond de la vue, qui est [UIColor clearColor]. Mais je ne peux pas changer cela, car j'ai besoin de certaines parties de mon point de vue pour être transparent.

Des idées?

+1

Regardez ce http://stackoverflow.com/questions/3060010/all-colors-work-except-whitecolor Il semble lié, mais pas la question exacte, il ne veut pas marquer comme doublon . –

+0

Lorsque vous changez la couleur d'arrière-plan en couleur blanche de couleur claire, les choses semblent-elles correctes? – Zigglzworth

+0

Oui, mais malheureusement ce n'est pas une option pour moi – Rits

Répondre

4
UIColor *color1 = [UIColor whiteColor]; 

La ligne ci-dessus crée probablement une couleur dans l'espace de couleurs en niveaux de gris.

Essayez ceci:

UIColor *color1 = [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:1.f]; 
+0

Oui, travaillé! Merci! – Rits

4

UIColors peut entraîner des couleurs définies dans différents espaces de couleur. Le blanc sera une couleur monochrome.

Ce code démontre, comment faire avec.

CGColorSpaceRef fillColorSpace = CGColorGetColorSpace([self.fillColor CGColor]); 
const float* fillColors = CGColorGetComponents([self.fillColor CGColor]); 

if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelRGB) { 
    CGContextSetRGBFillColor(contextRef, fillColors[0],fillColors[1], fillColors[2], fillColors[3]); 
} else if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelMonochrome){ 
    CGContextSetGrayFillColor(contextRef, fillColors[0], fillColors[1]); 
} 

Vous pouvez utiliser cette approche pour convertir les couleurs monochromes aux couleurs RVB comme puits:

if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelMonochrome){ 
     const float* colors = CGColorGetComponents([self.fillColor CGColor]); 
     self.fillColor = [UIColor colorWithRed:colors[0] 
             green:colors[0] 
              blue:colors[0] 
             alpha:colors[1]]; 
} 

Maintenant, la couleur est RVB, de sorte que vous n'avez pas besoin de faire la distinction entre les fonctions CG pour la couleur différente des modèles.

const float* fillColors = CGColorGetComponents([self.fillColor CGColor]); 
CGContextSetRGBFillColor(contextRef, fillColors[0],fillColors[1], fillColors[2], fillColors[3]); 
Questions connexes