CoreGraphics绘图校正

时间:2014-01-26 01:14:17

标签: core-graphics cgcontext cgpath

以下代码说明如下。可以注意到左侧线条与右侧线条相比具有细线。 其他观察Quad曲线不是那么尖锐。 我怎样才能让它看起来更好?

- (void)drawRect:(CGRect)rect
{    
    CGContextRef contextRef=UIGraphicsGetCurrentContext();
    [self drawBatteryEdges:contextRef withFinalBorderRect:rect];
}

-(void) drawBatteryEdges:(CGContextRef) contectRef withFinalBorderRect:(CGRect) batteryRect{
    CGFloat topOffset=20.0f;
    CGFloat bottomOffset=20.0f;
    CGFloat curveOffset=4f;

    CGMutablePathRef path=CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 0, topOffset);
    CGPathAddQuadCurveToPoint(path, NULL, batteryRect.size.width/2.0, topOffset-(curveOffset), batteryRect.size.width, topOffset);
    CGPathAddLineToPoint(path, NULL, batteryRect.size.width, batteryRect.size.height-bottomOffset);
    CGPathAddQuadCurveToPoint(path, NULL,
                              batteryRect.size.width/2.0, (CGPathGetCurrentPoint(path).y)+(curveOffset),
                              0, (CGPathGetCurrentPoint(path).y));

    CGPathCloseSubpath(path);

    CGContextAddPath(contectRef, path);
    CGContextDrawPath(contectRef, kCGPathStroke);

}

它得出以下结论。

enter image description here

1 个答案:

答案 0 :(得分:0)

温德里克,雷。 “核心图形教程:线条,矩形和渐变。” 2013年4月15日。 http://www.raywenderlich.com/32283/core-graphics-tutorial-lines-rectangles-and-gradients

  

嗯,事实证明,当Core Graphics描绘一条路径时,它会绘制   在路径的确切边缘中间的笔划。

     

在您的情况下,路径的边缘是您要填充的矩形。   因此,当沿着该边缘绘制1像素线时,该线的一半(1/2   像素)将在矩形的内侧,而另一半   线(1/2像素)将位于矩形的外侧。

     

但当然,因为无法绘制1/2像素,而不是Core   图形使用抗锯齿来绘制两个像素,但只是更轻   阴影给出的外观是它只是一个像素。

     

但是你不想要没有抗锯齿,你只想要一个像素,darnit!   有几种方法可以解决这个问题:

     
      
  • 您可以使用剪辑来剪切不需要的像素
  •   
  • 您可以禁用抗锯齿功能并修改矩形边界以确保笔划位于您想要的位置
  •   
  • 您可以修改笔划路径,以便考虑1/2像素效果
  •   

我建议在半像素上绘制笔划,这将涉及到这样的事情:

CGRectMake(rect.origin.x + 0.5, rect.origin.y + 0.5, rect.size.width - 1, rect.size.height - 1);