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

时间:2012-09-17 22:08:24

标签: iphone ios cocoa-touch core-graphics

我有以下代码:

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

在某个例子中,我正在加载一个具有fillColorstrokeColor的图形对象。当我这样做时,填充完成,但根本没有绘制笔划(我已经仔细检查以查看是否有任何错误分配了笔划值,一切看起来都还可以)。为什么是这样?如果你在一起做这两个,你是否需要同时做这些,即在一个CGContextDrawPath

1 个答案:

答案 0 :(得分:5)

你打电话给CGContextDrawPath,CoreGraphics绘制(填充或描边)您之前添加到上下文中的CGPathRef ,然后从该上下文中删除CGPathRef 已经使用过了。

因此,如果您在第一个“if”条件中调用CGContextDrawPath,则只需将CGPathRef重新添加到上下文中,然后再重新绘制。


此外,仅当您需要填充或描述它(或两者)时,将路径添加到上下文会更有效,如果fillColorstrokeColor都不添加,则不会添加路径是nil(如果你不填充或抚摸它,我需要建立/添加你的路径。)

正如你自己指出的那样,无论如何,同时填充和描边都有一个常数,称为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);
}

那样:

  • 如果您只有fillColor而没有strokeColor,则只会设置填充颜色并使用kCGPathFill
  • 如果您只有strokeColor而没有fillColor,则只会设置描边颜色并与之对齐,并使用kCGPathStroke
  • 如果您指定了两种颜色,则会同时设置填充颜色,描边颜色和线条,并使用kCGPathFillStroke