提问人:Ser Pounce 提问时间:6/28/2023 最后编辑:Ser Pounce 更新时间:7/1/2023 访问量:59
如何检测两个 CAShapeLayers 何时相交并更改相交像素的颜色
How to detect when two CAShapeLayers intersect and to change the color of the intersecting pixels
问:
我有一个名为 which subclasses 的类。在这个类中,有一个属性,我用它来定义各种类型的复杂形状。使用 ,ShapeView 将转换为 ,然后将其设置为 image 属性。ShapeView
UIImageView
CALayer
shape
UIGraphicsBeginImageContextWithOptions
shape
UIImage
UIImageView's
使用此设置,我想合并两个相互相交的形状,如下所示:
如您所见,我正在设置每个形状的 stroke 属性,以便每个形状都有一个黑色边框。我想让它,如果两个形状相互相交,我可以检测到另一个形状内部的笔触部分,并更改这些像素的颜色,以便给人一种两个形状正在合并的印象。CAShapeLayer
UIClearColor
不过,对于如何检测已转换为 a 的某个区域是否在另一个也已转换为 .以及如何将这些精确像素的颜色更改为(这甚至可能吗?CAShapeLayer
UIImage
CAShapeLayer
UIImage
UIClearColor
谢谢!
答:
我真的不明白你想用图像做什么......但让我们看一下路径选项(而不是从每个路径/形状生成一个)。UIImage
如果您的目标是,我们可以利用 CGPathCreateCopyByUnioningPath
(对于以前的 iOS 版本,您可以在那里找到一些 Bezier Path 库)。iOS 16.0+
简单描述...
假设我们用这些分隔的矩形创建两个矩形路径:
CGRect r1 = CGRectMake(60, 20, 100, 100);
CGRect r2 = CGRectMake(200, 60, 100, 100);
CGPathRef pthA = CGPathCreateWithRect(r1, nil);
CGPathRef pthB = CGPathCreateWithRect(r2, nil);
如果我们随后将这些路径添加到可变路径中:
CGMutablePathRef pth = CGPathCreateMutable();
CGPathAddPath(pth, nil, pthA);
CGPathAddPath(pth, nil, pthB);
shapeLayer.path = pth;
我们得到这个:
现在让我们更改矩形,使它们重叠:
CGRect r1 = CGRectMake(100, 20, 100, 100);
CGRect r2 = CGRectMake(160, 60, 100, 100);
CGPathRef pthA = CGPathCreateWithRect(r1, nil);
CGPathRef pthB = CGPathCreateWithRect(r2, nil);
CGMutablePathRef pth = CGPathCreateMutable();
CGPathAddPath(pth, nil, pthA);
CGPathAddPath(pth, nil, pthB);
shapeLayer.path = pth;
我们得到这个结果:
由于您的目标是“删除重叠的线”,因此我们可以使用...与上述相同的重叠矩形:CGPathCreateCopyByUnioningPath
CGRect r1 = CGRectMake(100, 20, 100, 100);
CGRect r2 = CGRectMake(160, 60, 100, 100);
CGPathRef pthA = CGPathCreateWithRect(r1, nil);
CGPathRef pthB = CGPathCreateWithRect(r2, nil);
CGPathRef pth = CGPathCreateCopyByUnioningPath(pthA, pthB, NO);
shapeLayer.path = pth;
现在我们得到这个作为输出:
我在这里发布了一个示例项目: https://github.com/DonMag/CGPathUnion
评论
UIImage