Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS核心图形:仅绘制CGPath的阴影_Objective C_Ios_Core Graphics_Shadow_Cgpath - Fatal编程技术网

Objective c iOS核心图形:仅绘制CGPath的阴影

Objective c iOS核心图形:仅绘制CGPath的阴影,objective-c,ios,core-graphics,shadow,cgpath,Objective C,Ios,Core Graphics,Shadow,Cgpath,我在iOS 5中用核心图形绘制了一条简单的路径: CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint( path, NULL, center.x , topMargin ); CGPathAddLineToPoint(path, NULL, center.x+20, topMargin+50); CGPathAddLineToPoint(path, NULL, center.x , topMargin+

我在iOS 5中用核心图形绘制了一条简单的路径:

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   );
现在我想在叠加模式下填充它,如下所示:

[[UIColor colorWithRed:0 green:0 blue:0 alpha:0.4] setFill];
CGContextAddPath(context, path);
CGContextSetBlendMode (context, kCGBlendModeOverlay);
CGContextFillPath(context);
这正好给了我预期的结果。但接下来,我想创建一个浮雕效果。我想用白色和黑色的阴影来达到这样的效果:

[[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时,不会绘制阴影。

现在的问题是:有没有一种方法可以只绘制阴影而不使用填充颜色,而是使用完整的alpha?我能以某种方式阻止我的道路内部被画出来吗?或者,是否有一种更简单的方法可以为一条路径绘制两个阴影?

我建议您将上下文的剪裁路径设置为形状路径的倒数,配置阴影,并以完全不透明度正常填充形状。剪切路径将遮罩填充颜色,并且只保留阴影

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
和一个附加的矩形子路径将剪切区域设置为原始路径未覆盖的区域。这将适用于任何非自相交的路径。

Wow,
CGContextEOClip
非常强大。这正是我想要的,谢谢!