How is the relation between UIView's clipsToBounds and CALayer's masksToBounds?

15,944

Solution 1

They are different names because UIView and CALayer are different and have different terminology associated with them, but they are functionally equivalent. If you disassemble clipsToBounds you will see it just calls masksToBounds (disassembly from the simulator framework, so 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

Solution 2

Some one asked what will happen if clipToBounds is set to false and maskToBounds is set to true or it can be better if someone add screenshots

I stumbled upon the same issue where I wanted to set corner radius and shadow both to the view.

but it is not possible because as soon as I set masksToBound to YES it removes the shadow but clip the content and if I set it to NO it shows the shadow but does not clip the content.

I have made the project which explains it better Understanding the ClipToBound And MasksToBound

I have come to the conclusion that CALayer is not a container but it is simply a class representing a rectangle on the screen with visual content. every drawing done on UIView goes on CALayer which causes the visual content to draw

masksToBound set to NO masksToBound set to YES

Share:
15,944
Thanks
Author by

Thanks

I like to play guitar. Sometimes I need to develop software. But I hate it ;) I mean... it sucks. It really does. Well, not always. Oh, and I think I'm the guy with the most questions here.

Updated on July 31, 2022

Comments

  • Thanks
    Thanks almost 2 years

    A UIView has a CALayer. That's pretty sure. But both seem to provide something that means the same thing.

    If I'd set clipsToBounds=YES, would this also set the layer's masksToBounds=YES? Why different names? Anyone knows?

  • Thanks
    Thanks almost 15 years
    wow, impressive! how do you get to this details? could that be done just in xcode when building or is there a tool needed to check what's going on?
  • KeremV
    KeremV almost 15 years
    For quick disassembly I use otool, which is part of the Developer tools. If I walking through a lot of code I tend to use otx to generate a complete assembly listing including doing all the selector lookups for me.
  • David Zorychta
    David Zorychta almost 11 years
    How can you tell from looking at that, that it really just calls masksToBounds?
  • Saurabh Hooda
    Saurabh Hooda almost 11 years
    @Macmee if you move the code sample view above to the right hand side (see there is scroll bar on that) then you will see call to masksToBounds.
  • Farshid Zaker
    Farshid Zaker over 8 years
    scroll bar was the golden hint!
  • Ozgur Vatansever
    Ozgur Vatansever about 8 years
    Great explanation. It should be an accepted answer.