使用下面的代码,我成功地屏蔽了我的绘图的一部分,但它与我想要屏蔽的相反。这屏蔽了绘图的内部,而我想要屏蔽外部。有简单的方法来反转这个屏蔽吗?
下面的myPath
是一个UIBezierPath
。
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
CGMutablePathRef maskPath = CGPathCreateMutable();
CGPathAddPath(maskPath, nil, myPath.CGPath);
[maskLayer setPath:maskPath];
CGPathRelease(maskPath);
self.layer.mask = maskLayer;
9条答案
按热度按时间rnmwe5a21#
在形状层(
maskLayer.fillRule = kCAFillRuleEvenOdd;
)上使用奇偶填充,你可以添加一个覆盖整个帧的大矩形,然后添加你要遮罩的形状。这将有效地反转遮罩。wgx48brx2#
适用于Swift 3.0
js4nwp543#
基于这个公认的答案,下面是Swift中的另一个mashup,我将它变成了一个函数,并将
invert
设置为可选zazmityj4#
这是我的Swift 4.2解决方案,它允许转弯半径
biswetbf5#
雨燕5
谢谢@arvidurs
cyvaqqii6#
适用于Swift 4.2
vjrehmav7#
为了反转蒙版,你可以这样做
1.这是交叉直肠的面具
1.这里我在交叉矩形周围添加第三个矩形,所以使用。evenOdd,它占用的面积等于(新矩形-旧交叉矩形),换句话说,在交叉矩形的面积之外
sxissh068#
有很多很好的答案,它们都使用奇偶规则来解决内部和外部表面。以下是Swift 5使用非零规则的方法:
对于蒙版操作,这是相当直接的。我们画矩形,并使用它作为蒙版路径。
对于反向遮罩,我们使用将要被遮罩的视图的边界,然后逆时针绘制它,然后添加默认为顺时针绘制的
UIBezierPath
矩形,这样矩形内的任何点p都将有一个顺时针交点和一个逆时针交点,导致总缠绕数为零,使该点成为外部点。pgpifvop9#
适用于2023年。目前这里的所有答案似乎都是错误的,因为它们在布局更改时(或者-仅举一个例子-当视图的大小或形状动画时)不调整遮罩。
很简单...
注意,
examp
已经设置了掩码。请注意,填充规则是根据需要设置的。
这是视图中间的一个小圆圈。
如果你想"拥有形状",那就
如果你想"拥有形状的反转",那就
简而言之,这个的"负面"。
是这样的
原来如此。
别忘了...
任何时候你有一个遮罩(或者一个图层!)你必须把它设置在
layoutSubviews
中。(这就是为什么layoutSubviews被命名为layoutSubviews!)