iPhone:分离描边和填充不起作用



我有以下代码:

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

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

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


此外,仅当您需要填充或描边(或两者兼而有之)时才将路径添加到上下文中会更有效,如果fillColorstrokeColor都不为零,则不要添加它(如果您不填充或描边,则需要构建/添加您的路径)。

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

最新更新