C'est un peu improvisé, mais c'est l'approche que j'adopterais probablement. Il s'agit de créer un dégradé d'angle en le dessinant directement dans un bitmap à l'aide d'une simple trigonométrie, puis en l'intégrant à un cercle. Je crée une grille de mémoire en utilisant un espace colorimétrique en niveaux de gris, je calcule l'angle entre un point donné et le centre, puis je le colore sur la base d'une fonction périodique, allant de 0 à 255. Vous pouvez bien sûr étendre cette méthode pour obtenir des couleurs RGBA.
Bien sûr, vous pouvez cacher cela et jouer avec les mathématiques pour obtenir les couleurs que vous voulez. Actuellement, l'image va du noir au blanc, ce qui n'est pas aussi bien que vous le souhaiteriez.
- (void)drawRect:(CGRect)rect {
CGImageAlphaInfo alphaInfo = kCGImageAlphaNone;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
size_t components = CGColorSpaceGetNumberOfComponents( colorSpace );
size_t width = 100;
size_t height = 100;
size_t bitsPerComponent = 8;
size_t bytesPerComponent = bitsPerComponent / 8;
size_t bytesPerRow = width * bytesPerComponent * components;
size_t dataLength = bytesPerRow * height;
uint8_t data[dataLength];
CGContextRef imageCtx = CGBitmapContextCreate( &data, width, height, bitsPerComponent,
bytesPerRow, colorSpace, alphaInfo );
NSUInteger offset = 0;
for (NSUInteger y = 0; y < height; ++y) {
for (NSUInteger x = 0; x < bytesPerRow; x += components) {
CGFloat opposite = y - height/2.;
CGFloat adjacent = x - width/2.;
if (adjacent == 0) adjacent = 0.001;
CGFloat angle = atan(opposite/adjacent);
data[offset] = abs((cos(angle * 2) * 255));
offset += components * bytesPerComponent;
}
}
CGImageRef image = CGBitmapContextCreateImage(imageCtx);
CGContextRelease(imageCtx);
CGColorSpaceRelease(colorSpace);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect buttonRect = CGRectMake(100, 100, width, width);
CGContextAddEllipseInRect(ctx, buttonRect);
CGContextClip(ctx);
CGContextDrawImage(ctx, buttonRect, image);
CGImageRelease(image);
}