CGGradient有3种颜色

时间:2012-07-30 07:53:51

标签: ios core-graphics

如何用3种颜色绘制CGGradient?

我有一个像这样的数组:

CFArrayRef colors = (__bridge CFArrayRef) [NSArray arrayWithObjects:(id)lightGradientColor.CGColor,
                                           (id)darkGradientColor.CGColor, (id)lightGradientColor.CGColor,
                                           nil];

但是我看不到中间的深色,顶部和底部有光线,而是顶部有光线,底部是暗色。

2 个答案:

答案 0 :(得分:3)

您是否尝试过指定/验证颜色的位置?范围是[0 ... 1]:

const CGFloat locations[3] = {0.0, 0.5, 1.0};
CGGradientRef grad = CGGradientCreateWithColors(colorspace, colors, locations);

注意:上述位置应与0参数的locations相同。

答案 1 :(得分:0)

使用CGGradient而不是CAGardientLayer传递多种颜色,以获得更平滑的效果:

一个。创建一个自定义的UIView类,标题中包含@property NSArray *颜色。在实现文件中,粘贴以下drawRect方法。

-(void)drawRect:(CGRect)rect {

    //1. create vars
    float increment = 1.0f / (colours.count-1);
    CGFloat * locations = (CGFloat *)malloc((int)colours.count*sizeof(CGFloat));
    CFMutableArrayRef mref = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);

    //2. go through the colours, creating cgColors and locations
    for (int n = 0; n < colours.count; n++){
        CFArrayAppendValue(mref, (id)[colours[n] CGColor]);
        locations[n]=(n*increment);
    }

    //3. create gradient
    CGContextRef ref = UIGraphicsGetCurrentContext();
    CGColorSpaceRef spaceRef = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradientRef = CGGradientCreateWithColors(spaceRef, mref, locations);
    CGContextDrawLinearGradient(ref, gradientRef, CGPointMake(0.0, 0.0), CGPointMake(0.0, self.frame.size.height), kCGGradientDrawsAfterEndLocation);
    CGColorSpaceRelease(spaceRef);
    CGGradientRelease(gradientRef);
}

B中。在viewController中,您希望使用自定义类,初始化它,设置框架及其颜色。它适用于任何一种以上的颜色,在这种情况下从上到下运行。

Background * bg = [Background new];
[bg setFrame:self.view.bounds];
[bg setColours:@[[UIColor blueColor],[UIColor purpleColor]]];
[self.view addSubview:bg];

它比使用CAGradientLayer更平滑,如果你将alpha放在颜色上会更加明显:

CGGradient CAGradientLayer