Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将渐变绘制到图层CGLayerRef中_Ios_Ios4_Xcode4 - Fatal编程技术网

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

Ios 无法将渐变绘制到图层CGLayerRef中,ios,ios4,xcode4,Ios,Ios4,Xcode4,我不熟悉Xcode和iOS开发。我试图画一个渐变层,这样我可以在我的视图中重复画这个层。这个渐变形成了视图的背景,我在这个渐变上画了一些图。但当我在图层中绘制渐变,然后在视图的上下文中绘制渐变时,它不会绘制渐变。我试过调试代码,但一切似乎都很好。将相关代码粘贴到下面: 我在开始时创建gradientLayer CGContextRef context = UIGraphicsGetCurrentContext(); CGRect myRect = self.bounds; CGGradientR

我不熟悉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中尝试优化绘图时,我无法这样做。

渐变的RGBA值应该在0.0f和1.0f之间,而不是在0.0f和255.0f之间。

您需要将CGLAYEREF转换为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之间