iOS核心显卡:仅绘制CGPath的阴影

vwhgwdsa  于 2022-12-20  发布在  iOS
关注(0)|答案(2)|浏览(132)

我在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?我可以用某种方法阻止我的路径内部被画出来吗?或者有没有一种更简单的方法可以为一条路径画两个阴影?

czq61nw1

czq61nw11#

我建议你把上下文的剪切路径设置成形状路径的反方向,配置阴影,然后用完全不透明的方式正常填充形状。剪切路径会屏蔽填充颜色,只有阴影会保留下来。

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和一个额外的矩形子路径来设置剪切区域为原始路径 * 没有 * 覆盖的区域,这对任何不自相交的路径都有效。

6rqinv9w

6rqinv9w2#

问题是,当alpha设置为0时,不会绘制阴影。
是,阴影依赖于形状的Alpha值进行渲染。
现在的问题是:有没有一种方法可以只画阴影而不画填充色,但是用完全的alpha?我可以用某种方法防止我的路径内部被画出来吗?或者有没有一种更简单的方法可以为一条路径画两个阴影?
你可以只画阴影而不渲染主体形状。这个想法是:
1.增加额外的偏移宽度到阴影,偏移应该足够大,即上下文/画布的宽度。2这样阴影就和主图形分开了。
1.使用相同的负水平偏移量平移上下文,以便主形状移出渲染区域,阴影移回。
对于仅阴影层,您可能希望使用beginTransparencyLayer(auxiliaryInfo:)saveGState()将绘图推入单独的上下文。
下面是一个比较:
第一节第一节第一节第一节第一次
对于代码片段,您可以在这里检查我对另一个问题的回答:https://stackoverflow.com/a/74844890/3164091

相关问题