当您调用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
.