2015-08-16 2 views
0

Je suis intrigué par la façon dont le code suivant fonctionne. Il est prévu de produire un disque noir entouré d'un cercle coloré. Cela fonctionne bien avec certaines couleurs (comme expliqué dans les commentaires), mais pas avec d'autres. Quelqu'un peut-il expliquer ce comportement mystérieux?Différents comportements pour différentes couleurs dans drawRect:

- (void)drawRect:(CGRect)rect 
{ 
    CGRect rectangle; CGFloat shiftVal=2.0,lineWidth=3.0; 
    rectangle.origin=CGPointMake(shiftVal, shiftVal); 
    rectangle.size=self.frame.size; 
    rectangle.size.width-=shiftVal*2; 
    rectangle.size.height-=shiftVal*2; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0); 
    CGContextFillEllipseInRect(context, rectangle); 

    CGContextSetLineWidth(context, lineWidth); 

    const CGFloat *components = CGColorGetComponents([UIColor greenColor].CGColor); // Works as expected. 
    //const CGFloat *components = CGColorGetComponents([UIColor darkGrayColor].CGColor); // No surrounding circle (instead of darkGray). 
    //const CGFloat *components = CGColorGetComponents([UIColor lightGrayColor].CGColor); // Produces a greenish circle (instead of lightGray) 
    // Draw the outer circle: 
    CGContextSetRGBStrokeColor(context, 
           components[0], 
           components[1], 
           components[2], 
           components[3]); 
    CGContextStrokeEllipseInRect(context, rectangle); 
} 
+0

avant d'approfondir ce sujet - vous savez ce qui est une bonne idée si quelque chose ne * ressemble pas * comme prévu? Images!!! 2 ou 3 captures d'écran seraient parfaites. – luk2302

+0

Remplacez l'appel de 'CGContextSetRGBStrokeColor' par une simple ligne:' [[UIColor someColor] setStroke]; '. – rmaddy

Répondre

0

similaires à this answer Je devine que darkGrayColor et lightGrayColor représentent tous les deux valeurs de gris sacle rgba valeurs plutôt tan. Et ne pas donc avoir 4 comoponents mais seulement 2.

Vous voudrez peut-être/avoir à utiliser une approche différente de définir la couleur:

CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor); 
+0

Merci, j'étais en train de mal comprendre comment fonctionne CGColorGetComponents. – Michel

2

Le problème est que

CGColorGetComponents([UIColor lightGrayColor].CGColor); 

ne fait pas renvoie les valeurs RVB "gris clair". Si vous inspectez ses valeurs dans le débogueur, vous verrez qu'il s'agit d'un tableau de 0.6667, 1, 0, 0. Ce sont les composants d'un gray-only color space. Vous devez utiliser une autre fonction comme CGContextSetStrokeColorWithColor ou UIColor's setStroke method pour définir la couleur. Ils ont aussi l'avantage d'être plus courts :)