【问题标题】:iOS Understanding Layer MaskingiOS 理解图层蒙版
【发布时间】:2014-09-13 18:00:28
【问题描述】:

我很难理解图层蒙版的工作原理。现在,我有一个带有 UILabels 的 UIView。我画了两层——一层是 UIView 在后面,一层是顶部的标签。如果我屏蔽 UIView 层,标签也会受到屏蔽的影响。

UILabels 是父 UIView 的子级,因此我可以理解影响子级的父级掩码。

但是,当我从层级的角度来看它时,它似乎没有任何意义。为什么屏蔽最深层会影响顶层?

【问题讨论】:

    标签: ios objective-c uiview calayer


    【解决方案1】:

    如您所说,UIView 是父级,UILabels 是子级。当需要更新屏幕时,UIView 从一个空白画布开始。它把自己画到画布上,然后让孩子们把自己画到画布上。当孩子们画画时,他们会受到父母施加的约束,例如剪裁和遮罩。

    【讨论】:

    • 我明白了。它似乎自相矛盾,因为 UIView 层位于最底部。
    【解决方案2】:

    将图层视为一张纸。将视图层想象成一张大白纸。如您所见,标签的图层是视图图层的子级。关联起来,将标签的图层想象为粘在大视图图层表上的纸条。

    假设您希望用一个圆圈遮盖图层。为了将其转化为我们的小类比,您希望用哈利波特的隐形斗篷覆盖大视图的图层表,其中有一个圆形孔。

    为此,您需要将隐形斗篷剪成与视图图层表相同的大小。

    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 属性。

    让我们谈谈边界。这很简单。只需选择一个笔尖为borderWidth 点宽的borderColor 的锐器,然后小心地在视图图层表的边缘绘制。而已。

    我希望你现在得到东西,并且可以对美妙的CALayer 的其他属性进行自己的类比。

    【讨论】:

    • 纯诗,伟大的类比!
    • 这太棒了,谢谢你写这篇文章。斗篷隐喻很棒,但是如果我在 labelLayer 上应用蒙版,我很难看到它是如何应用的。标签被掩盖,但不是背景。在我看来,斗篷下的所有东西(包括 bigViewLayer)不应该也被掩盖吗?
    • 不,因为它只放在标签上,所以你可以透过它看到下面的背景。如果你穿着隐形斗篷,站在墙前,观察者仍然会看到墙,不是吗?
    • @user3854397 jrturton 说了什么。斗篷不会帮你看穿地球本身,对吧?口罩现在不会在你的手机屏幕上烧个洞吧?
    • 如果我只想将斗篷放在 bigViewLayer 上,然后滑入标签和视图之间怎么办?这可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多