【问题标题】:iOS Core Graphics: Draw ONLY shadows of a CGPathiOS 核心图形:仅绘制 CGPath 的阴影
【发布时间】:2011-11-17 16:27:22
【问题描述】:

我正在使用 Core Graphics 在 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的阴影?我能以某种方式阻止我的路径内部被绘制吗?或者是否有一种更简单的方法可以为一条路径绘制两个阴影?

【问题讨论】:

    标签: objective-c ios core-graphics shadow cgpath


    【解决方案1】:

    我建议你将上下文的剪切路径设置为形状路径的倒数,配置阴影,正常填充形状,完全不透明。剪切路径将掩盖填充颜色,只保留阴影。

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

    【讨论】:

    • 哇,CGContextEOClip 真的很强大。这正是我想要的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多