Pat*_*ity 20 core-graphics objective-c shadow cgpath ios
我在iOS 5中使用Core Graphics绘制了一个简单的路径:
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 );
Run Code Online (Sandbox Code Playgroud)
现在我想填写Overlay模式,如下所示:
[[UIColor colorWithRed:0 green:0 blue:0 alpha:0.4] setFill];
CGContextAddPath(context, path);
CGContextSetBlendMode (context, kCGBlendModeOverlay);
CGContextFillPath(context);
Run Code Online (Sandbox Code Playgroud)
这给了我完全预期的结果.但接下来,我想创造一个浮雕效果.我想过使用白色和黑色阴影来实现这样的效果:
[[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);
Run Code Online (Sandbox Code Playgroud)
问题是,当alpha设置为0时,不会绘制阴影.
现在的问题是:有没有办法只绘制没有填充颜色的阴影,但是在完整的alpha中?我可以以某种方式阻止我的路径内部被绘制?或者是否有一种更简单的方法可以为一条路径绘制两个阴影?
Kar*_*tey 23
我建议你将上下文的剪切路径设置为形状路径的倒数,配置阴影,并正常填充形状,完全不透明.剪切路径将遮盖填充颜色,并且仅保留阴影.
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);
Run Code Online (Sandbox Code Playgroud)
诀窍是使用CGContextEOClip一个额外的矩形子路径将剪切区域设置为原始路径未覆盖的任何内容.这适用于任何非自相交的路径.
| 归档时间: |
|
| 查看次数: |
7393 次 |
| 最近记录: |