ios 如何检测两个CAShapeLayer何时相交以及如何更改相交像素的颜色

lskq00tm  于 2023-07-01  发布在  iOS
关注(0)|答案(1)|浏览(137)

我有一个名为ShapeView的类,它是UIImageView的子类。在这个类中,有一个名为shapeCALayer属性,我使用它来定义各种类型的复杂形状。使用UIGraphicsBeginImageContextWithOptions,ShapeView将shape转换为UIImage,然后将其设置为UIImageView's图像属性。
使用此设置,我想合并两个形状,彼此相交如下:

如您所见,我正在设置每个CAShapeLayer的stroke属性,以便每个形状都有一个黑色边框。我想让它这样,如果两个形状彼此相交,我可以检测到另一个形状内部的笔划部分,并将这些像素的颜色更改为UIClearColor,以便给人的印象是两个形状正在合并。
我有点困惑,但如何检测是否某个区域的CAShapeLayer,已转换为UIImage,是在另一个CAShapeLayer也已转换为UIImage。以及如何将这些精确像素的颜色更改为UIClearColor(这甚至可能吗?)).
谢谢!

u5i3ibmn

u5i3ibmn1#

我真的不明白你想用这些照片做什么...但是让我们看看Path选项(而不是从每个路径/形状生成UIImage)。
如果你的目标是iOS 16.0+,我们可以利用CGPathCreateCopyByUnioningPath(对于以前的iOS版本,你可以在那里找到一些Bezier路径库)。
查看空房情况
假设我们用这些 separated rect创建两个矩形路径:

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

相关问题