1

特定の形状の影だけを作成したい (影の原因となるオブジェクトなし)。たとえば、楕円の場合:

CGContextSetShadowWithColor(ctx, offset, blur, color.CGColor);
CGContextFillEllipseInRect(ctx, drawInRect);

影は綺麗に描けますが、形は透明にしたいです。塗りつぶしの色をクリアに設定しようとしました:

CGContextSetFillColorWithColor(ctx, UIColor.clearColor.CGColor);

これにより、影も抑制されます。

黒い影で透明な形を実現する最も簡単な方法は何ですか? マスクをする必要がある場合、Quartz でどのように行うのですか?

編集:最初の回答者が指摘したように、質問があいまいまたはわかりにくいものでした。私はそれを少しクリアしようとしました。

4

2 に答える 2

3

影だけを表示し、楕円は表示したくないですか?

これを Quartz で描画している場合、これは注意が必要です。Quartz は楕円の外観を使用して影を生成するからです。楕円をクリップまたはマスクすると、影にも影響します。

1 つの可能性は、影のオフセットと楕円の位置を調整して、楕円がコンテキストの可視領域の外になるようにすることです。たとえば、100 x 100 のビットマップ コンテキストで描画している場合、楕円の位置を {normalPosition.x - 100, normalPosition.y} に設定し、影の offset.x を 100 増やすことができます。そうすれば、楕円は次のようになります。完全に文脈から外れていますが、影は同じ場所にあります。(もちろん、必要に応じて計算を調整してください。)

別の方法: shadowPathCALayer でプロパティを使用すると、レイヤーのコンテンツではなく、そのパスのみに基づいて影が生成されます。状況によっては、純粋な CG よりも管理しやすい場合があります。

于 2012-05-15T21:03:04.927 に答える
1

クリッピング パスでこれを行うことができます。EO スタッフは、すべてが描画される外部空間と何も描画されない内部空間を定義するために必要です。

後で明るい色の赤い円を入れているので、これを少し複雑にしました。

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx); // store to ignore the clipping path later
    float margin = self.bounds.size.width * .1;
    CGRect ellipseRect = CGRectMake(margin, margin, self.bounds.size.width - 2*margin, self.bounds.size.height - 2*margin);

    // OUTER path is just the bounds
    CGMutablePathRef mutablePath = CGPathCreateMutable();
    CGPathRef pathRef = CGPathCreateWithRect(self.bounds, NULL);
    CGPathAddPath(mutablePath, NULL, pathRef);
    // INNER path is the same as the ellipse
    CGPathRef pathRef2 = CGPathCreateWithEllipseInRect(ellipseRect, NULL);
    CGPathAddPath(mutablePath, NULL, pathRef2);
    CGContextAddPath(ctx, mutablePath);
    CGContextEOClip(ctx);    

    CGContextSetFillColorWithColor(ctx, UIColor.greenColor.CGColor);
    CGContextSetShadowWithColor(ctx, CGSizeMake(margin/2.0f, margin/2.0f), 10, UIColor.blackColor.CGColor);
    CGContextFillEllipseInRect(ctx, ellipseRect);

    // replace the green circle for a very transparent red one just for fun
    CGContextRestoreGState(ctx);
    CGContextSetFillColorWithColor(ctx, [UIColor.redColor colorWithAlphaComponent:.1].CGColor);
    CGContextSetShadowWithColor(ctx, CGSizeZero, 0, NULL);
    CGContextFillEllipseInRect(ctx, ellipseRect);
}
于 2012-05-15T22:17:08.910 に答える