为什么我的CGGradient与预设的UIColor无法正常工作?

8

我有这个可用的代码:

    NSMutableArray *shadowColors = [NSMutableArray arrayWithCapacity:2];
    color = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; // Declaration using components
    [shadowColors addObject:(id)[color CGColor]];
    color = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.0]; // Declaration using components
    [shadowColors addObject:(id)[color CGColor]];

    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColors(space, (CFArrayRef)shadowColors, NULL);
    CGColorSpaceRelease(space);

    CGFloat sw = 10.0; // shadow width

    CGPoint top1 = CGPointMake(x, y+width/2.0);
    CGPoint top2 = CGPointMake(x + sw, y+width/2.0);

    CGPoint side1 = CGPointMake(x+width/2.0, y);
    CGPoint side2 = CGPointMake(x+width/2.0, y+sw);

    CGContextDrawLinearGradient(c, gradient, top1, top2, 0);
    CGContextDrawLinearGradient(c, gradient, side1, side2, 0);
    CGGradientRelease(gradient);

我感兴趣的是颜色声明部分,即第2行和第4行。当我按照所示进行声明时,它们可以正常工作,但是如果我将这两行替换为等效的(至少我认为是等效的)[UIColor blackColor][UIColor clearColor],那么我的渐变就会消失。我使用的颜色没有任何影响,我可以使用greenColorredColor,它们仍然无法工作。

我是否遗漏了什么,还是这是苹果框架中的一个错误?


不起作用的代码。这只是第一节,其他所有内容都相同。

    NSMutableArray *shadowColors = [NSMutableArray arrayWithCapacity:2];
    color = [UIColor blackColor];
    [shadowColors addObject:(id)[color CGColor]];
    color = [UIColor clearColor];
    [shadowColors addObject:(id)[color CGColor]];

将类型转换为id可以消除“传递不兼容指针类型的参数”的警告。 - kubi
哦,我更新了我的问题,并附上了不起作用的代码。 - kubi
Eiko: -CGColor 返回一个 CGColorRef,它没有声明为 Objective-C 对象,但可以通过桥接作为一个 Objective-C 对象使用(因为它是一个 CF 对象)。由于它没有声明为 Objective-C 对象,所以需要进行强制转换;由于它可以作为一个 Objective-C 对象使用,所以这个转换是安全的。 - Peter Hosey
kubi:你为什么要自己绘制阴影,而不是在绘制应该有这个阴影的任何东西之前设置一个黑色阴影呢?请参见http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html%23//apple_ref/c/func/CGContextSetShadowWithColor。 - Peter Hosey
如果在阴影上设置模糊半径> 0,则会产生渐变效果。 - Peter Hosey
显示剩余3条评论
1个回答

1

我认为代码看起来很好。 blackColorclearColor 可能都在白色空间中,但文档说 CGGradientCreateWithColors 将把颜色转换为您传递的颜色空间,所以这不应该有影响。

我唯一能想到的是尝试将颜色空间传递给 NULL,让渐变将颜色转换为通用 RGB 而不是设备 RGB。这可能有效,但不应该有任何区别——就我所见,两种方式都应该可以工作。

我建议提交错误报告


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接