2010-10-10 60 views
8

J'ai ce code de travail:Pourquoi mon CGGradient ne fonctionne-t-il pas avec un UIColor prédéfini?

NSMutableArray *shadowColors = [NSMutableArray arrayWithCapacity:2]; 
    color = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; // Declaration using components 
    [shadowColors addObject:(id)[color CGColor]]; 
    color = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.0]; // Declaration using components 
    [shadowColors addObject:(id)[color CGColor]]; 

    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef gradient = CGGradientCreateWithColors(space, (CFArrayRef)shadowColors, NULL); 
    CGColorSpaceRelease(space); 

    CGFloat sw = 10.0; // shadow width 

    CGPoint top1 = CGPointMake(x, y+width/2.0); 
    CGPoint top2 = CGPointMake(x + sw, y+width/2.0); 

    CGPoint side1 = CGPointMake(x+width/2.0, y); 
    CGPoint side2 = CGPointMake(x+width/2.0, y+sw); 

    CGContextDrawLinearGradient(c, gradient, top1, top2, 0); 
    CGContextDrawLinearGradient(c, gradient, side1, side2, 0); 
    CGGradientRelease(gradient); 

Les déclarations de couleur sont la partie que je suis intéressé, les lignes 2 et 4. Quand je les déclarer comme le montre, ils fonctionnent très bien, mais si je remplace ces deux lignes avec l'équivalent (je pensais, au moins) [UIColor blackColor] et [UIColor clearColor] puis mes gradients disparaissent. Les couleurs que j'utilise ne font aucune différence, je peux utiliser greenColor et redColor et elles ne fonctionnent toujours pas.

Ai-je raté quelque chose ou est-ce un bug dans les frameworks d'Apple?


Le code qui ne le fait pas travail. Et ce n'est que la première section, tout le reste est le même.

NSMutableArray *shadowColors = [NSMutableArray arrayWithCapacity:2]; 
    color = [UIColor blackColor]; 
    [shadowColors addObject:(id)[color CGColor]]; 
    color = [UIColor clearColor]; 
    [shadowColors addObject:(id)[color CGColor]]; 
+0

Pouvez-vous montrer * exactement * à quoi ressemble votre code qui ne fonctionne pas? PS: Pourquoi jetez-vous quelque chose à id? Cela n'a pas de sens. – Eiko

+0

La conversion en id supprime un avertissement "passage d'un argument de type pointeur incompatible". – kubi

+0

oh, et j'ai mis à jour ma question avec le code non-travail. – kubi

Répondre

1

Le code me semble bien. blackColor et clearColor sont probablement tous les deux dans un espace de couleur blanche, mais la documentation indique CGGradientCreateWithColors va convertir les couleurs à l'espace de couleur que vous passez, de sorte que cela ne devrait pas importer. La seule chose que je peux penser serait d'essayer de passer NULL pour l'espace colorimétrique, en laissant le dégradé convertir les couleurs en RVB générique au lieu de RVB périphérique. Cela peut fonctionner, mais cela ne devrait pas faire de différence. Pour autant que je puisse le voir, cela devrait fonctionner dans les deux cas. Je suggère filing a bug.