我很难理解图层蒙版的工作原理。现在,我有一个带有 UILabels 的 UIView 。我想象了两层——一层是后面的 UIView,一层是顶部的标签。如果我屏蔽 UIView 层,标签也会受到屏蔽的影响。
UILabels 是父 UIView 的子级,因此我可以理解父级掩码也会影响子级。
然而,当我从层次上来看,却似乎没有什么意义。为什么遮盖最深层会影响顶部的层?
将图层想象成一张纸。将视图层视为一张大白纸。正如您所发现的,标签层是视图层的子层。为了联系起来,可以将标签的层想象为粘在大视图的层表上的纸条。
假设您希望用圆圈遮盖图层。为了将其转化为我们的小类比,您希望用哈利·波特的隐形斗篷覆盖大视图的图层,其中有一个圆形孔。
为此,您需要将隐形斗篷裁剪为与视图图层表相同的大小。
cloakLayer.frame = bigViewLayer.frame;
然后,你小心地从中剪出一个圆圈。
cloakLayer.path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, 0) radius:15.0 startAngle:0.0 endAngle:2 * M_PI clockwise:YES];
cloakLayer.fillColor = [UIColor blackColor].CGColor; // the hole
然后,将这件带孔的斗篷粘贴到大视图的图层上,小心地对齐边缘。
bigViewLayer.mask = cloakLayer;
什么会消失?床单上任何不属于您从斗篷上取下的圆圈的东西(因为斗篷被切割成床单的尺寸)。这就是
mask
属性。
我们来谈谈
masksToBounds
属性。
假设将标签层表条粘贴到大视图的层表上时,您决定仅将标签层表条的一半放置在表上,并使其余部分悬挂在边缘上。
假设您将
masksToBounds
设置为 YES
。剪纸之神现在要做的就是整齐地剪掉标签条中不在大视图图层表边缘内的部分。这就是 masksToBounds
属性。
我们来谈谈边界。这很简单。只需选择一个笔尖为
borderColor
宽的 borderWidth
记号笔,然后小心地在视图图层的边缘上绘制。就是这样。
我希望你现在就明白了,并且可以对美妙的
CALayer
的其他属性进行自己的类比。
正如你所说,UIView 是父级,UILabels 是子级。当需要更新屏幕时,UIView 以空白画布开始。它把自己画到画布上,然后让孩子们把自己画到画布上。当孩子们画画时,他们会受到父母施加的限制,例如:剪辑和遮罩。
iOS CALayer.mask
CALayer
有一个 mask
属性,即 CALayer
,它将遮罩的 Alpha 通道应用于 mask 父图层。
layer
+ mask
= 遮罩层