0

我有以下代码:

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

在某个实例中,我正在加载一个具有 afillColor和 a的图形对象strokeColor。当我这样做时,填充已完成,但根本没有绘制笔画(我已经仔细检查过分配笔画值是否有任何错误,一切看起来都很好)。为什么是这样?如果你同时做这两个,你需要同时做,即合二为一CGContextDrawPath吗?

4

1 回答 1

5

当您调用CGContextDrawPath时,CoreGraphics 会绘制(填充或描边)CGPathRef您之前添加到上下文中的 ,然后CGPathRef从该上下文中删除它是否已被使用。

因此,如果您已经调用CGContextDrawPath了您的第一个“if”条件,您只需将您的内容重新添加CGPathRef到您的上下文中,然后才能再次绘制它。


此外,仅当您需要填充或描边(或两者)并且如果两者都没有fillColor也不strokeColor是 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.
于 2012-09-17T22:13:26.193 回答