私はアルファチャンネルをサポートするために文書化されているCGGradientCreateWithColorComponentsCGGradientRef
で作成しています:
この配列の項目数は、count と色空間の成分数の積でなければなりません。たとえば、色空間が RGBA 色空間で、グラデーションに 2 つの色 (1 つは開始位置用、もう 1 つは終了位置用) を使用する場合、赤、緑、最初の色の青、およびアルファ値、2 番目の色の赤、緑、青、およびアルファ値が続きます。
以下は、完全なビューの実装です。
.h
@interface AlphaGrad : UIView
@end
.m
@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
問題は、透明度がサポートされていないようで、透明な部分が白く溺れてしまうことです:
CGGradientRef
「下」のサブビューを部分的に見えるようにするために透過性を取得することは可能ですか?