2010-11-27 6 views
6

Le problème est décrit dans le sujet. Voici mon code ci-dessous:CGGradientCreateWithColors renvoie un pointeur nul

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor blueColor], nil]; 
CGGradientRef gradient = CGGradientCreateWithColors(NULL, (CFArrayRef)colors, NULL); 

Il est ne fonctionne pas. En fait, le dernier appel renvoie nil;

Il ne fonctionne pas non plus lorsque je remplace le premier argument NULL par une référence CGColorSpace, par ex. Device RGB.

Quel est le problème, quelqu'un a-t-il une idée?

Répondre

17

Vous devez accéder au CGColor cast de UIColor:

NSArray *colors = [NSArray arrayWithObjects:(id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor, nil]; 

En outre, la spécification d'un espace colorimétrique est recommandé:

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, NULL); 
+0

Je ne pensais pas que vous pourriez juste coller CGColorRefs (ils ne sont pas NSObjects?) dans un NSArray comme ça? Lorsque j'utilise [NSValue valueWithPointer:], je n'ai toujours rien pour le dégradé. Il me manque quelque chose ici ... – WiseOldDuck

+0

WiseOldDuck a raison, vous ne pouvez pas simplement coller des CGColors dans un NSArray. Vous devez d'abord classer chacun d'entre eux en (id). Une fois que vous faites cela, alors ce qui précède fonctionne. –

+0

@JoeStrout: Confirmé et mis à jour. Merci. –

3

CGGradientCreateWithColors() attend un tableau de CGColorRef s, pas UIColor s. AFAIK UIColor n'est pas sans frais ponté avec CGColorRef.

2
CGFloat locations[2]; 
locations[0] = 0.0; 
locations[1] = 1.0; 

CGGradientRef gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, locations); 
+0

Si les emplacements sont NULL, la première couleur des couleurs est affectée à l'emplacement 0, les dernières couleurs incolorées sont affectées à l'emplacement 1 et les couleurs intermédiaires sont affectées à des emplacements à intervalles égaux. – Beau

Questions connexes