【问题标题】:CGGradientCreateWithColorComponents and alpha channelICGGradient 使用颜色组件和 alpha 通道创建
【发布时间】:2013-06-01 21:07:42
【问题描述】:

我正在创建 CGGradientRef 和 CGGradientCreateWithColorComponents,它被记录为支持 Alpha 通道:

这个数组中的项目数应该是 count 和 颜色空间中的分量数。例如,如果颜色 space 是一个 RGBA 颜色空间,您想在 渐变(一个用于起始位置,另一个用于结束 位置),那么您需要在组件中提供 8 个值——红色、绿色、 蓝色和第一种颜色的 alpha 值,然后是红色、绿色、 蓝色和第二种颜色的 alpha 值。

下面是完整的视图实现:

.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 获得透明度以使“较低”子视图部分可见?

【问题讨论】:

    标签: ios core-graphics


    【解决方案1】:

    抱歉,我没有将backgroundColor 设置为clearColor,从而解决了问题。让我把它留在这里以备将来参考。

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 2011-08-02
      • 2011-06-11
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多