Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CALayer和CGGradientRef抗锯齿?_Iphone_Core Animation_Gradient_Antialiasing_Radial Gradients - Fatal编程技术网

Iphone CALayer和CGGradientRef抗锯齿?

Iphone CALayer和CGGradientRef抗锯齿?,iphone,core-animation,gradient,antialiasing,radial-gradients,Iphone,Core Animation,Gradient,Antialiasing,Radial Gradients,我对iPhone的CALayer绘图有一个奇怪的问题。我有一个根层,它添加了一堆表示“气泡”的子层。最终结果应该是这样的: 问题是,我似乎无法将层设置为anti-alias(注意气泡上的锯齿)。我为bubble CALayer覆盖drawInContext的代码如下: - (void)drawInContext:(CGContextRef)theContext{ CGContextSetAllowsAntialiasing(theContext, true); CGContextSetShou

我对iPhone的CALayer绘图有一个奇怪的问题。我有一个根层,它添加了一堆表示“气泡”的子层。最终结果应该是这样的:

问题是,我似乎无法将层设置为anti-alias(注意气泡上的锯齿)。我为bubble 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));
}
}

现在真正奇怪的是,如果我稍微修改绘图代码,只画正常的红色圆圈,如下所示:

- (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));
}
一切似乎都很好:

我似乎无法理解这种看似奇怪的行为。我是否遗漏了抗锯齿渐变和法线圆之间的一些差异


谢谢各位。

也许可以尝试退出kCGGradientDrawsAfterEndLocation?它可能会在alpha上做一些奇怪的事情,Jeff-将topCenter放远一点,并将CGContextClipToMask与圆形掩码一起使用

编辑:实际上更好的方法是使用CGContextClip使用向量剪辑路径

编辑2:示例代码:

CGContextAddEllipseInRect(theContext, CGRectMake(20, 20, 10, 10));
CGContextClip(theContext);

在绘制渐变之前添加此项,并将其进一步绘制。

谢谢各位。所以答案是你的两个答案(库布和亚历克斯)的组合。基本上,CGDrawRadialGradient函数似乎只在开始圆处有锯齿,而不是结束圆。由于我希望在两条边上都使用别名“edges”,因此我首先将函数设置为从内向外绘制,这将处理第一条“edges”,但会产生以下结果:

然后,我按照coob的建议剪辑图像,这在气泡的最后边缘周围产生了一个很好的别名:

对我来说已经足够好了

- (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);

}

提示:我的直肠必须插入1点才能完全消除这里的锯齿。