【问题标题】:Generate a CGPath from another path's line width outline从另一个路径的线宽轮廓生成 CGPath
【发布时间】:2013-05-08 23:50:25
【问题描述】:

我可能没有以最好的方式解释这一点,所以请多多包涵。

我所拥有的是在 MKMapView 对象之上绘制的 CGPath:

我能够做到这一点的方法是为较深的蓝色线创建一个 CGPath,然后创建该路径的副本,然后用半透明的蓝色描边它的较粗版本。这是我目前使用的代码:

    // set the shadow around the path line
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetRGBStrokeColor(context, 0.0f, 0.0f, 0.0f, 0.0f);
    CGContextSetRGBFillColor(context, 0.0f, 0.0f, 1.0f, 0.4f);
    CGPathRef shadowPath = CGPathCreateCopyByStrokingPath(self.path.CGPath, NULL, 80.0f, kCGLineCapRound, kCGLineJoinRound, 0.0f);
    CGContextBeginPath(context);
    CGContextAddPath(context, shadowPath);
    CGContextDrawPath(context, kCGPathFillStroke);
    CGContextRestoreGState(context);
    CGPathRelease(shadowPath);

效果很好,目前没有任何问题。

但是,我想做的是获取那个较厚的半透明蓝色区域的轮廓的 CGPathRef。这是另一个屏幕截图,显示了我想要的伪路径(手绘为红色):

这怎么可能?

【问题讨论】:

    标签: ios core-graphics cgpath


    【解决方案1】:

    简单:只需使用CGPathCreateCopyByStrokingPath。传入宽线宽,上限为kCGLineCapRound

    【讨论】:

    • Kurt,这正是我已经用半透明蓝色生成这个轮廓的方式。我想要的是获得该轮廓的 CGPath,如果这有意义的话。
    • 也许你可以画出你到底想要什么,然后呢?我不完全确定您所说的“大纲”是什么意思。如果您想在该路径周围再进行一次描边,请再次致电CGPathCreateCopyByStrokingPath
    • Kurt,我刚刚更新了这个问题,澄清了我已经在使用的代码。我还包含了另一个屏幕截图,其中轮廓路径为红色。
    • @jpm 你能写出解决方案吗?我有完全一样的问题。我尝试了 CGPathCreateCopyByStrokingPath,但得到了以下结果:dl.dropbox.com/u/3400922/Screenshots/74.png
    • @PavelAlexeev 啊哈,好问题。我的结果完全一样,在浪费了无数个小时试图找出我的代码中的错误在哪里之后,我向 Apple 开了一张 DTS 票。原来 CGPathCreateCopyByStrokingPath 有一个错误会生成这个看起来很奇怪的轮廓路径。他们要求我检查 iOS 7 中是否仍然存在该错误,但我还没有时间这样做。希望这对您有所帮助。
    【解决方案2】:

    你可以画两笔。

    宽度为 n (其中 n 是轮廓宽度)和黑色的笔画。 然后在第一个笔画上绘制另一个笔画,使用橡皮擦模式:

    CGContextSetBlendMode(context, kCGBlendModeCopy);
    CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2013-03-24
      • 2018-06-04
      • 2020-03-30
      • 2017-08-23
      • 2013-01-01
      相关资源
      最近更新 更多