gpt4 book ai didi

iphone - CALayer 和 CGGradientRef 抗锯齿?

转载 作者:行者123 更新时间:2023-12-03 19:11:25 27 4
gpt4 key购买 nike

我在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com