无法将渐变绘制到图层CGLayerRef中

时间:2011-09-25 17:28:34

标签: ios ios4 xcode4

我是Xcode和iOS开发的新手。我正在尝试将渐变绘制到图层中,以便我可以在视图中重复绘制此图层。这个渐变形成了视图的背景,我做了一些绘制这个渐变。但是当我在我的图层中绘制渐变,然后在我的视图的上下文中绘制它时,它不会绘制渐变。我试过调试代码,但一切似乎都很好。粘贴下面的相关代码: 我在开始时创建了gradientLayer。

CGContextRef context = UIGraphicsGetCurrentContext();
CGRect myRect = self.bounds;
CGGradientRef myGradient;
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGFloat colors[] =
{
    204.0 / 255.0, 224.0 / 255.0, 244.0 / 255.0, 1.00,
    100 / 255.0, 200 / 255.0, 50 / 255.0, 1.00,
    0, 0, 0, 1.00,
};
myGradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));
CGColorSpaceRelease(rgb);

CGContextRef layerContext = CGLayerGetContext(gradientLayer);
CGPoint start, end;
CGRect clip = CGContextGetClipBoundingBox(layerContext);
start = getStartPoint(clip);
end = getEndPoint(clip);
CGContextDrawLinearGradient(layerContext, myGradient, start, end, 0);
//CGContextSetRGBFillColor (layerContext, red / 255.0, green / 255.0, blue / 255.0, 1);
//CGContextFillRect (layerContext, clip);

我的类被实例化时调用此函数。然后在我的drawRect方法中重复绘制这个图层。

CGRect rect = self.bounds;
CGContextSaveGState(context);
CGContextDrawLayerInRect(context, rect, gradientLayer);
CGContextSaveGState(context);

我可以直接在drawRect中绘制相同的渐变,但在绘制图层然后在drawRect(尝试优化绘图)时无法这样做。

2 个答案:

答案 0 :(得分:0)

渐变的RGBA值应介于0.0f和1.0f之间,且不介于0.0f和255.0f之间。

答案 1 :(得分:0)

您需要将CGLayerRef转换为CGContextRef 像这样:

    CGContextRef context = UIGraphicsGetCurrentContext();
     CGLayerRef layer = CGLayerCreateWithContext(context, myRect.size, NULL);
        CGContextRef gradientContext = CGLayerGetContext(layer);
// from here we care only on this  gradientContext
    // somewhere call 
    CGContextDrawLinearGradient(gradientContext, /*other args*/ 

// don't forget to clean memory 

CGLayerRelease(layer);

您可以将渐变绘制到CGContextRef上下文

或者,如果您想要逃避这些转化,可以使用普通CGContextRef

以下是我实现渐变的方法

CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
   // CGLayerRef gradientLayer = CGLayerCreateWithContext(ctx, myRect.size, NULL);
    CGFloat colors[] =
    {
        204.0 / 255.0, 224.0 / 255.0, 244.0 / 255.0, 1.00, //color 1
        100 / 255.0, 200 / 255.0, 50 / 255.0, 1.00, // color 2
        0.0, 0.0, 0.0, 1.00, // color3 
    };
     CGFloat locations[3] = { 0.0, 0.5, 1.0 }; // 3 locations
    CGGradientRef   myGradient = CGGradientCreateWithColorComponents(rgb, colors, locations, 3);
    CGColorSpaceRelease(rgb);
  //  CGContextRef layerContext = CGLayerGetContext(gradientLayer);
    CGFloat minX = CGRectGetMinX(self.bounds);
    CGFloat minY = CGRectGetMinY(self.bounds);
    CGFloat maxY = CGRectGetMaxY(self.bounds);
    CGContextBeginPath(ctx);
    CGRect clip = self.bounds;
    CGContextAddRect(ctx, clip);
    //release memory
    CGContextClip(ctx);
    CGContextDrawLinearGradient(ctx, myGradient, CGPointMake(minX,minY), CGPointMake(minX,maxY), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
    CGGradientRelease(myGradient);

使用上面的代码获取渐变, 当然,你可以调整位置和颜色以获得你想要的效果,但是 记住位置总是介于0.0和1.0之间