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。