核心图形:CGContextClip()边缘不需要的奇怪抗锯齿

时间:2014-11-14 21:07:48

标签: ios objective-c uikit core-graphics cgcontext

我正在尝试使用CGContextClip()来做一些绘图,但是我遇到了一些奇怪的抗锯齿问题。问题似乎是填充正在与正在替换的颜色混合,而不是与周围的像素混合。有关问题的详细描述,请参阅图像!

问题示例:

enter image description here

(注意蓝边正在被抗锯齿化)

奇怪的抗锯齿边缘

enter image description here (边缘应与白色混合,而不是蓝色)

代码:

-(void) drawRect:(CGRect)rect {

    CGContextRef c = UIGraphicsGetCurrentContext();

    CGContextSaveGState(c);
    {

        CGContextBeginPath(c);
        CGContextAddEllipseInRect(c, CGRectMake(25, 25, 200, 200));
        CGContextClosePath(c);
        CGContextClip(c);

        CGContextSetFillColorWithColor(c, [UIColor blueColor].CGColor);
        CGContextFillRect(c, rect);

        CGContextSetFillColorWithColor(c, [UIColor redColor].CGColor);
        CGContextFillRect(c, CGRectMake(0, 0, 250, 125));

    }
    CGContextRestoreGState(c);


}

关于如何防止这种奇怪的抗锯齿的任何想法?我无法禁用它,因为圆边仍然需要抗锯齿!

为了清楚起见,这只是一个例子。我试图在一个更复杂的形状上解决这个问题,其中只能填充一半裁剪的解决方案是不可能的!

1 个答案:

答案 0 :(得分:0)

嗯,这并没有100%解决问题,但它确实减少了相当数量的怪异抗锯齿。我从this question得到了这个想法。我们的想法是,在绘制之前清除要绘制的区域中的任何先前渲染,方法是将混合模式更改为清除,执行绘图,然后将其切换回正常,然后重新绘制。修改后的代码如下所示:

-(void) drawRect:(CGRect)rect {

    CGContextRef c = UIGraphicsGetCurrentContext();

    CGContextSaveGState(c);
    {

        CGContextBeginPath(c);
        CGContextAddEllipseInRect(c, CGRectMake(25, 25, 200, 200));
        CGContextClosePath(c);
        CGContextClip(c);

        CGContextSetFillColorWithColor(c, [UIColor blueColor].CGColor);
        CGContextFillRect(c, CGRectMake(25, 25, 200, 200));

        CGContextSetFillColorWithColor(c, [UIColor redColor].CGColor);
        CGRect r = CGRectMake(0, 0, 250, 125);

        CGContextSetBlendMode(c, kCGBlendModeClear);
        CGContextFillRect(c, r);
        CGContextSetBlendMode(c, kCGBlendModeNormal);
        CGContextFillRect(c, r);


    }
    CGContextRestoreGState(c);

} 

如果有人想出一个更好的解决方案,100%修复此问题,那么将其作为答案发布,我会接受它!