我在为 iPhone 绘制 CALayer 时遇到了一个奇怪的问题。我有一个根层,它添加了一堆代表“气泡”的子层。最终结果应该是这样的:
http://www.expensivedna.com/IMG_0018.PNG http://www.expensivedna.com/IMG_0018.PNG
问题是我似乎无法让图层抗锯齿(注意气泡上的锯齿)。我为气泡 CALayer 覆盖 drawInContext 的代码如下:
- (void)drawInContext:(CGContextRef)theContext{
CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
size_t num_locations = 2;
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = { 1.0, 1.0, 1.0, 0.5, // Start color
1.0, 1.0, 1.0, 0.0 }; // End color
CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef glossGradient =
CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
CGPoint topCenter = CGPointMake(25, 20);
CGPoint midCenter = CGPointMake(25, 25);
CGContextDrawRadialGradient(theContext, glossGradient, midCenter, 20, topCenter, 10, kCGGradientDrawsAfterEndLocation);
}
现在真正奇怪的是,如果我稍微更改绘图代码以仅绘制正常的红色圆圈,如下所示:
- (void)drawInContext:(CGContextRef)theContext{
CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
CGContextSetFillColorWithColor(theContext, [UIColor redColor].CGColor);
CGContextFillEllipseInRect(theContext, CGRectMake(0, 0, 40,40));
}
一切似乎都可以抗锯齿:
http://www.expensivedna.com/IMG_0017.PNG http://www.expensivedna.com/IMG_0017.PNG
我似乎无法弄清楚这种看似奇怪的行为。我是否遗漏了抗锯齿渐变和普通圆圈之间的一些区别?
谢谢你们。
最佳答案
谢谢你们。所以事实证明答案是你的两个答案(coob 和 Alex)的组合。基本上,CGDrawRadialGradient 函数似乎只在起始圆处有锯齿,而在结束圆处没有锯齿。由于我想要在两者上使用别名“边缘”,我首先将函数设置为从内向外绘制,它负责处理第一个“边缘”,但产生以下结果:
Step 1
然后,我按照 coob 的建议裁剪图像,并在气泡的最后边缘周围产生很好的锯齿:
Step 2
对我来说看起来足够好!
- (void)drawInContext:(CGContextRef)theContext{
CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
size_t num_locations = 2;
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = { 1.0, 1.0, 1.0, 0.0, // Start color
1.0, 1.0, 1.0, 0.5 }; // End color
CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef glossGradient =
CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
CGContextAddEllipseInRect(theContext, CGRectMake(5, 5, 40, 40));
CGContextClip(theContext);
CGPoint topCenter = CGPointMake(25, 20);
CGPoint midCenter = CGPointMake(25, 25);
CGContextDrawRadialGradient(theContext, glossGradient, topCenter, 10, midCenter, 20, kCGGradientDrawsAfterEndLocation);
}
关于iphone - CALayer 和 CGGradientRef 抗锯齿?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/765838/