首页 文章

Quartz:无法使用渐变填充创建圆角矩形

提问于
浏览
2

我试图创建一个覆盖圆角区域的渐变填充 . 这是我在 drawRect: 中的代码:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextClearRect(ctx, rect);

CGFloat c = BUBBLE_INSET + BUBBLE_CORNER_RADIUS;

CGContextMoveToPoint(ctx, BUBBLE_INSET, c);

CGContextAddArcToPoint(ctx, BUBBLE_INSET, BUBBLE_INSET, c, BUBBLE_INSET, BUBBLE_CORNER_RADIUS);    
CGContextAddLineToPoint(ctx, rect.size.width - c, BUBBLE_INSET);
CGContextAddArcToPoint(ctx, rect.size.width - BUBBLE_INSET, BUBBLE_INSET, rect.size.width - BUBBLE_INSET, c, BUBBLE_CORNER_RADIUS);
CGContextAddLineToPoint(ctx, rect.size.width - BUBBLE_INSET, rect.size.height - c);
CGContextAddArcToPoint(ctx, rect.size.width - BUBBLE_INSET, rect.size.height - BUBBLE_INSET, rect.size.width - c, rect.size.height - BUBBLE_INSET, BUBBLE_CORNER_RADIUS);
CGContextAddLineToPoint(ctx, c, rect.size.height - BUBBLE_INSET);
CGContextAddArcToPoint(ctx, BUBBLE_INSET, rect.size.height - BUBBLE_INSET, BUBBLE_INSET, rect.size.height - c, BUBBLE_CORNER_RADIUS);

CGContextClosePath(ctx);

CGContextClip(ctx);

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
NSArray *colors = [NSArray arrayWithObjects:color1, color2, nil];

CGGradientRef gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, NULL);
CGColorSpaceRelease(space);

CGPoint p1 = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
CGPoint p2 = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));

CGContextDrawLinearGradient(ctx, gradient, p1, p2, 0);
CGGradientRelease(gradient);

此代码绘制一个空白色矩形 . 路径构建正确(我尝试调用 CGContextFillPath() ,结果很好地填充纯色), color1color2 值是正确的(在调试器中看到) . 这段代码出了什么问题?

2 回答

  • 2

    我不确定你的颜色是如何包裹颜色数组的 .

    尝试使用

    CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
    

    代替 .

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextClearRect(ctx, rect);
    
    CGFloat c = BUBBLE_INSET + BUBBLE_CORNER_RADIUS;
    
    CGContextMoveToPoint(ctx, BUBBLE_INSET, c);
    
    CGContextAddArcToPoint(ctx, BUBBLE_INSET, BUBBLE_INSET, c, BUBBLE_INSET, BUBBLE_CORNER_RADIUS);    
    CGContextAddLineToPoint(ctx, rect.size.width - c, BUBBLE_INSET);
    CGContextAddArcToPoint(ctx, rect.size.width - BUBBLE_INSET, BUBBLE_INSET, rect.size.width - BUBBLE_INSET, c, BUBBLE_CORNER_RADIUS);
    CGContextAddLineToPoint(ctx, rect.size.width - BUBBLE_INSET, rect.size.height - c);
    CGContextAddArcToPoint(ctx, rect.size.width - BUBBLE_INSET, rect.size.height - BUBBLE_INSET, rect.size.width - c, rect.size.height - BUBBLE_INSET, BUBBLE_CORNER_RADIUS);
    CGContextAddLineToPoint(ctx, c, rect.size.height - BUBBLE_INSET);
    CGContextAddArcToPoint(ctx, BUBBLE_INSET, rect.size.height - BUBBLE_INSET, BUBBLE_INSET, rect.size.height - c, BUBBLE_CORNER_RADIUS);
    
    CGContextClosePath(ctx);
    
    CGContextClip(ctx);
    
    CGGradientRef gradient;
    CGColorSpaceRef rgbColorspace;
    size_t num_locations = 2;
    CGFloat locations[2] = { 0.0, 1.0 };
    CGFloat components[8] = { 1.0, 0.0, 0.0, 1.0,  // Start color
        1.0, 1.0, 1.0, 0.65 }; // End color
    
    rgbColorspace = CGColorSpaceCreateDeviceRGB();
    gradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
    
    CGPoint p1 = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
    CGPoint p2 = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
    
    CGContextDrawLinearGradient(ctx, gradient, p1, p2, 0);
    CGGradientRelease(gradient);
    

    你会得到这个:

    偏移量为5.0半径为10.0

    enter image description here

  • 0

    事实证明,color1和color2的类型为 UIColor ,这是完全错误的 . 换了一行

    NSArray *colors = [NSArray arrayWithObjects:color1, color2, nil];
    

    NSArray *colors = [NSArray arrayWithObjects:[color1 CGColor], [color2 CGColor], nil];
    

    得到了我期待的结果 .

相关问题