CGGradientCreateWithColorComponents y alpha channelI

Estoy creando CGGradientRef con CGGradientCreateWithColorComponents que está documentado para admitir un canal alfa:

El número de elementos en esta matriz debe ser el producto de la count y la cantidad de componentes en el espacio de color. Por ejemplo, si el espacio de color es un espacio de color RGBA y desea usar dos colors en el gradiente (uno para una location inicial y otro para una location final), entonces debe proporcionar 8 valores en los componentes rojo, verde, azul y alfa para el primer color, seguido de los valores rojo, verde, azul y alfa para el segundo color.

A continuación se muestra la implementación completa de la vista:

.marido

 @interface AlphaGrad : UIView @end 

.metro

 @implementation AlphaGrad - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { } return self; } -(void) drawRect:(CGRect)rect { CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSaveGState(ctx); CGContextClip(ctx); CGGradientRef gradient = [self newGradientWithColors:[NSArray arrayWithObjects:[UIColor blackColor], [UIColor colorWithRed:0 green:0 blue:0 alpha:0.0f], nil] locations:[NSArray arrayWithObjects:@0, @1, nil]]; CGContextDrawLinearGradient(ctx, gradient, CGPointMake(rect.origin.x, rect.origin.y), CGPointMake(rect.origin.x, rect.origin.y+rect.size.height), kCGGradientDrawsAfterEndLocation); CGGradientRelease(gradient); CGContextRestoreGState(ctx); } - (CGGradientRef)newGradientWithColors:(NSArray*)colorsArray locations:(NSArray*)locationsArray { int count = [colorsArray count]; CGFloat* components = malloc(sizeof(CGFloat)*4*count); CGFloat* locations = malloc(sizeof(CGFloat)*count); for (int i = 0; i < count; ++i) { UIColor* color = [colorsArray objectAtIndex:i]; NSNumber* location = (NSNumber*)[locationsArray objectAtIndex:i]; size_t n = CGColorGetNumberOfComponents(color.CGColor); const CGFloat* rgba = CGColorGetComponents(color.CGColor); if (n == 2) { components[i*4] = rgba[0]; components[i*4+1] = rgba[0]; components[i*4+2] = rgba[0]; components[i*4+3] = rgba[1]; } else if (n == 4) { components[i*4] = rgba[0]; components[i*4+1] = rgba[1]; components[i*4+2] = rgba[2]; components[i*4+3] = rgba[3]; } locations[i] = [location floatValue]; } CGContextRef context = UIGraphicsGetCurrentContext(); CGColorSpaceRef space = CGBitmapContextGetColorSpace(context); CGGradientRef gradient = CGGradientCreateWithColorComponents(space, components, locations, count); free(components); free(locations); return gradient; } @end 

El problema es que la transparencia parece no ser compatible, la parte transparente se ahoga como blanco: introduzca la descripción de la imagen aquí

¿Es posible get transparencia con CGGradientRef para hacer que una subvista "inferior" sea parcialmente visible?

Lo siento por un problema, no establecí un backgroundColor para clearColor que resolvió el problema. Permítanme dejarlo aquí para una futura reference.