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