2010-11-27 12 views
6

Das Problem wird in dem Unterabschnitt beschrieben; Hier ist mein Code unten:CGGradientCreateWithColors gibt einen Nullzeiger zurück

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

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

Es nicht arbeiten. Tatsächlich gibt der letzte Anruf nil zurück;

Weder es funktioniert, wenn ich das erste Argument NULL durch eine CGColorSpace Referenz ersetzen, z. Gerät RGB.

Was ist los, hat jemand eine Idee?

Antwort

17

Sie benötigen die CGColor Besetzung von UIColor zuzugreifen:

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

Auch einen Farbraum spezifiziert empfohlen:

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

Ich glaube nicht, dass Sie nur CGColorRefs halten könnte (sie sind nicht NSObjects?) in ein NSArray so? Wenn ich [NSValue valueWithPointer:] benutze, bekomme ich immer noch keinen Gradienten zurück. Mir fehlt hier etwas ... – WiseOldDuck

+0

WiseOldDuck hat recht, man kann CGColors nicht einfach in ein NSArray stecken. Sie müssen jeden zuerst auf (id) tippen. Sobald Sie das tun, dann funktioniert das obige. –

+0

@JoeStrout: Bestätigt und aktualisiert. Vielen Dank. –

3

CGGradientCreateWithColors() erwartet ein Array von CGColorRef s, nicht UIColor s. AFAIK UIColor ist nicht gebührenfrei überbrückt mit CGColorRef.

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

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

Wenn die Position NULL ist, wird die erste Farbe in Farbe der Position 0, die letzte Farbe Incolors auf Position 1 und die dazwischen liegenden Farben auf Stellen mit gleichen Abständen dazwischen zugewiesen. – Beau

Verwandte Themen