1

奇妙なCGPathRef形のポリゴン用です。このパスの外側の領域にアルファを適用する必要があります。これは非常に簡単です。

CGContextAddPath(context, crazyPolygon);
CGContextSetFillColor(context, someAlphaColor);
CGContextEOFillPath(context);

サークルと同じようなことをする必要があります。これも簡単です。

CGMutablePathRef circlePath = CGPathCreateMutable();
CGPathAddRect(circlePath, NULL, rect);
CGPathAddEllipseInRect(circlePath, NULL, circleBox);
CGContextAddPath(context, circlePath);
CGContextSetFillColor(context, someAlphaColor);
CGContextEOFillPath(context);

2つの形状を交差させようとすると、問題が発生します。両方の形状の内側にないピクセルにアルファを適用したいと思います。

  • ポイントが円内にあるがポリゴン内にない場合は、アルファを適用します。
  • ポリゴン内にあるが円内にはない場合は、アルファを適用します。
  • ポリゴンと円の両方にある場合、ピクセルは完全に透明である必要があります。

私はさまざまなアプローチを試しました。どれも機能していません。最も有望なのは、ポリゴンを使用してマスクを作成し、それを使用CGContextClipToMaskして円の描画をバインドすることでした。ただし、完全な円はクリッピングなしで描画されました。

4

1 に答える 1

0

さらに数時間の試行錯誤の末、私はついにそれを理解しました。

// Set up
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat outOfAreaColor[4] = { 0.0, 0.0, 0.0, OUT_OF_AREA_ALPHA };
CGContextSetFillColor(context, outOfAreaColor);

// Path for specifying outside of polygons
CGMutablePathRef outline = CGPathCreateMutable();
CGPathAddRect(outline, NULL, rect);
CGPathAddPath(outline, NULL, path);

// Fill the area outside of the path with an alpha mask
CGContextAddPath(context, outline);
CGPathRelease(outline);
CGContextEOFillPath(context);

// Add the inside path to the context and clip the context to that area
CGContextAddPath(context, insidePolygon);
CGContextClip(context);

// Create a path defining the area to draw outside of the circle
// but within the polygon
CGRect circleBox = CGRectMake(0, 0, circleRadius * 2.0, circleRadius * 2.0);
CGMutablePathRef darkLayer = CGPathCreateMutable();
CGPathAddRect(darkLayer, NULL, rect);
CGPathAddEllipseInRect(darkLayer, NULL, circleBox);
CGContextAddPath(context, darkLayer);
CGContextEOFillPath(context);
CGPathRelease(darkLayer);

を使用する場合CGPathAddEllipseInRect、円/楕円の中心はcircleBox.origin.x + circleBox.size.width / 2.0, circleBox.origin.y + circleBox.size.height / 2.0ではなく、0.0, 0.0です。ドキュメントはこれを非常に明確にしていますが、シェイプを配置するときに理解しなければならないのは面倒です。

于 2011-08-11T16:26:53.940 に答える