2010-11-27 24 views
6

El problema se describe en el subjunto; Aquí está mi código de abajo:CGGradientCreateWithColors devuelve un puntero nulo

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

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

Se no trabajar. En realidad, la última llamada devuelve nil;

Ni funciona cuando reemplazo el primer argumento NULL con una referencia CGColorSpace, p. Dispositivo RGB.

¿Qué pasa, alguien tiene una idea?

Respuesta

17

que necesita para acceder al reparto de CGColorUIColor:

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

Además, la especificación de un espacio de color se recomienda:

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

no pensé que sólo podría pegarse CGColorRefs (¿no son NSObjects?) en un NSArray así? Cuando uso [NSValue valueWithPointer:] Aún obtengo nil de nuevo para gradiente. Me falta algo aquí ... – WiseOldDuck

+0

WiseOldDuck tiene razón, no puedes simplemente pegar CGColors en un NSArray. Primero tiene que encasillar cada uno en (id). Una vez que haces eso, ENTONCES lo anterior funciona. –

+0

@JoeStrout: confirmado y actualizado. Gracias. –

3

CGGradientCreateWithColors() espera una matriz de CGColorRef s, no UIColor s. AFAIK UIColor no tiene un puente de conexión gratuita con CGColorRef.

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

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

Si las ubicaciones son NULL, el primer color en colores se asigna a la ubicación 0, el último color incolors se asigna a la ubicación 1, y los colores intermedios se asignan a ubicaciones que están en intervalos iguales en el medio. – Beau

Cuestiones relacionadas