使用CoreGraphics进行线性渐变混叠

时间:2011-03-05 14:38:12

标签: core-graphics

我正试图模仿UITabBarItem的色彩效果效果。

当我以一定角度绘制线性渐变时,我会在渐变的中间部分看到可见的锯齿,其中两种颜色在同一位置相交。左边是UITabBarItem,右边是我的渐变,可见别名(踩踏):

gradient aliasing

以下是相关代码的片段:

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
CGContextRef c = UIGraphicsGetCurrentContext();

CGContextSaveGState(c);
CGContextScaleCTM(c, 1.0, -1.0);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
CGFloat components[16] = {1,1,1,1, 
                          109.0/255.0,175.0/255.0,246.0/255.0,1, 
                          31.0/255.0,133.0/255.0,242.0/255.0,1, 
                          143.0/255.0,194.0/255.0,248.0/255.0,1};
CGFloat locations[4] = {0.0, 0.62, 0.62, 1};
CGGradientRef colorGradient = 
      CGGradientCreateWithColorComponents(colorSpace, components, 
                                          locations, (size_t)4);
CGContextDrawLinearGradient(c, colorGradient, CGPointZero,
                            CGPointMake(size.width*1.0/3.9, -size.height),0);
CGGradientRelease(colorGradient);
CGColorSpaceRelease(colorSpace);
CGContextRestoreGState(c);

UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return resultImage;

我需要更改一下,以获得像UITabBarItem一样的平滑角度渐变?

2 个答案:

答案 0 :(得分:1)

您设置的上下文的插值质量是多少? CGContextGetInterpolationQuality()/ CGContextSetInterpolationQuality()。如果它太低,请尝试更改它。

如果这不起作用,我很好奇如果你垂直绘制渐变(0,Ymin) - (0,Ymax)会对你的上下文应用旋转变换会发生什么......

答案 1 :(得分:0)

作为当前的解决方法,我将双倍分辨率的渐变绘制到图像中,然后使用原始尺寸绘制图像。发生的图像缩放处理锯齿。在像素级别,结果不像UITabBarItem那样平滑,但可能使用在Photoshop中创建的图像或类似的东西。