iPhone:单独的笔划和填充不起作用

Ser*_*nce 0 iphone cocoa-touch core-graphics ios

我有以下代码:

    if (self.graphic.fillColor)
    {
        CGContextSetFillColorWithColor(context, self.graphic.fillColor);
        CGContextDrawPath(context, kCGPathFill);
    }

    if (self.graphic.strokeColor)
    {
        CGContextSetStrokeColorWithColor(context, self.graphic.strokeColor);
        CGContextSetLineWidth(context, self.graphic.strokeWidth);
        CGContextDrawPath(context, kCGPathStroke);
    }
Run Code Online (Sandbox Code Playgroud)

在某种情况下,我正在加载一个有a fillColor和a 的图形对象strokeColor.当我这样做,填充完毕,但行程完全不抽(我已仔细检查,看看是否有与行程值的分配任何错误,并且一切正常).为什么是这样?如果你在一起做这两个,你需要同时做这两个CGContextDrawPath吗?

Ali*_*are 5

如果您调用CGContextDrawPath,CoreGraphics绘制(填充或描边)CGPathRef您之前添加到上下文中的内容,然后CGPathRef从该上下文中删除已使用它的内容.

因此,如果您已经调用CGContextDrawPath了第一个"if"条件,则只需在重新CGPathRef绘制之前重新添加到上下文中.


此外,它会更有效的路径添加到您的上下文只有当你需要填充或描边它(或两者)并不会增加,如果没有fillColor,也不strokeColor是零(NE需要建立/,如果你把你的路径不会填补也不会中风).

正如你自己指出的那样,无论如何,同时填充和描边都有一个常数,称为kCGPathFillStroke.所以你的代码可能如下所示:

// Don't draw anything if both colors are nil
if (self.graphic.fillColor || self.graphic.strokeColor)
{
  // Build and add your CGPathRef here
  CGPathRef path = ...
  CGContextAddPath(context, path);

  // Then either fill, stroke, or fillstroke the path.
  CGPathDrawingMode mode;
  if (self.graphic.fillColor)
  {
    CGContextSetFillColorWithColor(context, self.graphic.fillColor);
    mode = kCGPathFill;
  }
  if (self.graphic.strokeColor)
  {
    CGContextSetStrokeColorWithColor(context, self.graphic.strokeColor);
    CGContextSetLineWidth(context, self.graphic.strokeWidth);
    // if we also have a fillcolor, use fillstroke mode. Else just use stroke.
    mode = (self.graphic.fillColor) ? kCGPathFillStroke : kCGPathStroke;
  }
  CGContextDrawPath(context, mode);
}
Run Code Online (Sandbox Code Playgroud)

那样:

  • 如果你只有fillColor和没有strokeColor,你只会设置填充颜色和使用kCGPathFill.
  • 如果你只有strokeColor和没有fillColor,你只会设置笔触颜色和线,并使用kCGPathStroke
  • 如果指定了两种颜色,则将设置填充颜色,描边颜色和线条,并使用kCGPathFillStroke.