我是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(尝试优化绘图)时无法这样做。
答案 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之间