iOS Core Graphics:仅绘制CGPath的阴影

我正在用Core Graphics在iOS 5中绘制一个简单的path:

CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint( path, NULL, center.x , topMargin ); CGPathAddLineToPoint(path, NULL, center.x+20, topMargin+50); CGPathAddLineToPoint(path, NULL, center.x , topMargin+40); CGPathAddLineToPoint(path, NULL, center.x-20, topMargin+50); CGPathAddLineToPoint(path, NULL, center.x , topMargin ); 

现在我想要在Overlay模式下填充它,如下所示:

 [[UIColor colorWithRed:0 green:0 blue:0 alpha:0.4] setFill]; CGContextAddPath(context, path); CGContextSetBlendMode (context, kCGBlendModeOverlay); CGContextFillPath(context); 

这给了我完全预期的结果。 但接下来,我想创build一个浮雕效果。 我想用白色和黑色阴影来达到这样的效果:

 [[UIColor colorWithRed:0 green:0 blue:0 alpha:0] setFill]; CGContextAddPath(context, path); CGContextSetShadowWithColor(context, CGSizeMake(1, 1), 1.0, highlightColor); CGContextSetBlendMode (context, kCGBlendModeNormal); CGContextFillPath(context); [[UIColor colorWithRed:0 green:0 blue:0 alpha:0] setFill]; CGContextAddPath(context, path); CGContextSetShadowWithColor(context, CGSizeMake(-1, -1), 1.0, shadowColor); CGContextSetBlendMode (context, kCGBlendModeNormal); CGContextFillPath(context); 

问题是,当alpha设置为0时,阴影不会被绘制。
现在的问题是:有没有一种方法绘制没有填充颜色的阴影,但完全是阿尔法? 我可以以某种方式防止我的path内部被绘制? 或者,也许有一种简单的方法为一条path绘制两个阴影?

我build议你将上下文的剪切path设置为形状path的反色,configuration阴影,并以完全不透明的方式正常填充形状。 剪切path将遮蔽填充颜色,只有阴影将保留。

 CGContextSaveGState(context); CGRect boundingRect = CGContextGetClipBoundingBox(context); CGContextAddRect(context, boundingRect); CGContextAddPath(context, path); CGContextEOClip(context); [[UIColor blackColor] setFill]; CGContextAddPath(context, path); CGContextSetShadowWithColor(context, CGSizeMake(1, 1), 1.0, highlightColor); CGContextSetBlendMode (context, kCGBlendModeNormal); CGContextFillPath(context); CGContextAddPath(context, path); CGContextSetShadowWithColor(context, CGSizeMake(-1, -1), 1.0, shadowColor); CGContextSetBlendMode (context, kCGBlendModeNormal); CGContextFillPath(context); CGContextRestoreGState(context); 

诀窍是使用CGContextEOClip和一个额外的矩形子path将剪辑区域设置为原path覆盖的区域。 这将适用于任何不是自相交的path。