UIView的clipsToBounds和CALayer的maskToBounds之间的关系如何?

Tha*_*nks 57 core-animation calayer uikit uiview ios

A UIView有一个CALayer.这很确定.但两者似乎都提供了同样的东西.

如果我设置clipsToBounds=YES,这还会设置图层masksToBounds=YES吗?为什么不同名字?有谁知道?

Lou*_*arg 118

它们是不同的名称,因为它们是不同的UIView,CALayer并且具有与它们相关的不同术语,但它们在功能上是等同的.如果您反汇编,clipsToBounds您将看到它只是调用masksToBounds(从模拟器框架反汇编,所以x86):

-(BOOL)[UIView(Rendering) clipsToBounds]
    +0  3091938a  55              pushl    %ebp
    +1  3091938b  89e5            movl     %esp,%ebp
    +3  3091938d  e800000000      calll    0x30919392
    +8  30919392  59              popl     %ecx
    +9  30919393  8b4508          movl     0x08(%ebp),%eax
   +12  30919396  8b5004          movl     0x04(%eax),%edx         (CALayer)_layer
   +15  30919399  8b8186cb1301    movl     0x0113cb86(%ecx),%eax    masksToBounds
   +21  3091939f  89450c          movl     %eax,0x0c(%ebp)
   +24  309193a2  895508          movl     %edx,0x08(%ebp)
   +27  309193a5  c9              leave
   +28  309193a6  e92e211801      jmpl     0x31a9b4d9
Run Code Online (Sandbox Code Playgroud)

  • @Macmee如果你将上面的`code sample`视图移到右侧(看那里有滚动条),那么你将看到对masksToBounds的调用. (8认同)
  • 为了快速反汇编,我使用otool,它是Developer工具的一部分.如果我浏览了大量代码,我倾向于使用otx生成一个完整的程序集列表,包括为我执行所有选择器查找. (3认同)

Vik*_*nha 6

有人问,如果将 clipToBounds 设置为 false 并将 maskToBounds 设置为 true 会发生什么,或者如果有人添加屏幕截图会更好

我偶然发现了同样的问题,我想为视图设置角半径和阴影。

但这是不可能的,因为一旦我将 maskToBound 设置为 YES,它就会删除阴影但剪辑内容,如果我将其设置为 NO,它会显示阴影但不剪辑内容。

我制作了一个更好地解释它的项目 理解 ClipToBound 和 MasksToBound

我得出的结论是 CALayer 不是一个容器,而只是一个类,代表屏幕上具有视觉内容的矩形。在 UIView 上完成的每个绘图都在 CALayer 上进行,这会导致绘制视觉内容

maskToBound 设置为 NO maskToBound 设置为 YES