呼び出すと、CoreGraphicsは、以前にコンテキストに追加したものをCGContextDrawPath
描画(塗りつぶしまたはストローク)し、それが使用されているコンテキストからを削除します。CGPathRef
CGPathRef
したがってCGContextDrawPath
、最初の「if」条件で呼び出した場合はCGPathRef
、コンテキストを再度描画する前に、コンテキストに自分を再度追加する必要があります。
さらに、パスを塗りつぶすかストロークする必要がある場合(または両方)にのみパスをコンテキストに追加する方が効果的であり、どちらfillColor
でもない場合は追加しないでstrokeColor
ください(パスを作成/追加する必要がある場合は塗りつぶしたり、ストロークしたりしません)。
とにかく、あなたが自分自身を指摘したように、塗りつぶしとストロークの両方を同時に行う定数は、と呼ばれ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
。