1

我只想为某些形状创建一个阴影(没有导致阴影的对象)。例如,对于椭圆:

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

阴影画得很好,但我希望形状是透明的。我尝试将填充颜色设置为清除:

CGContextSetFillColorWithColor(ctx, UIColor.clearColor.CGColor);

这导致阴影也被抑制。

用黑色阴影实现透明形状的最简单方法是什么?如果我需要做一个面具,我将如何用 Quartz 做这个?

编辑:正如第一个回答者指出的那样,这个问题模棱两可或令人困惑。我试图澄清一下。

4

2 回答 2

3

你想只看到阴影,而不是椭圆?

如果你用 Quartz 来画这个,这很棘手,因为 Quartz 使用椭圆的外观来生成阴影。如果你剪掉或遮住椭圆,那也会影响阴影。

一种可能性是调整阴影的偏移量和椭圆的位置,以使椭圆位于上下文的可见区域之外。例如,如果您在 100 x 100 位图上下文中绘制,您可以将椭圆的位置设置为 {normalPosition.x - 100, normalPosition.y},并将阴影的 offset.x 增加 100。这样,椭圆会完全脱离上下文,但影子会在同一个地方。(当然,根据您的情况调整数学。)

另一种选择:如果您shadowPath在 CALayer 上使用该属性,则仅基于该路径生成阴影,而不是基于图层的内容。根据您的情况,它可能比纯 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 回答