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

fillColor特定のインスタンスでは、とを持つグラフィック オブジェクトをロードしていますstrokeColor。これを行うと、塗りつぶしは完了しますが、ストロークはまったく描画されません (ストローク値の割り当てにバグがあるかどうかを再確認したところ、すべて問題ないように見えました)。どうしてこれなの?これら 2 つを一緒に行う場合、同時に行う必要がありますか。つまり、1 つにまとめますCGContextDrawPathか。

4

1 に答える 1

5

呼び出すと、CoreGraphicsは、以前にコンテキストに追加したものをCGContextDrawPath描画(塗りつぶしまたはストローク)し、それが使用されているコンテキストからを削除します。CGPathRefCGPathRef

したがって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
于 2012-09-17T22:13:26.193 に答える