【问题标题】:Unable to draw gradient into a layer CGLayerRef无法将渐变绘制到图层 CGLayerRef
【发布时间】:2011-09-25 17:28:33
【问题描述】:

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

【问题讨论】:

    标签: ios ios4 xcode4


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您需要将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 之间

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 2012-08-14
        • 1970-01-01
        相关资源
        最近更新 更多