Quelle est la relation entre les clipsToBounds D'UIView et les masksToBounds de CALayer?
Un UIView
a une CALayer
. C'est à peu près sûr. Mais les deux semblent fournir quelque chose qui signifie la même chose.
si j'avais mis clipsToBounds=YES
, est-ce que cela aurait aussi mis masksToBounds=YES
de la couche ? Pourquoi des noms différents? Quelqu'un sait?
2 réponses
ce sont des noms différents parce que UIView
et CALayer
sont différents et ont une terminologie différente associée à eux, mais ils sont fonctionnellement équivalents. Si vous démontez clipsToBounds
, vous verrez qu'il appelle simplement masksToBounds
(disassmebly à partir du simulateur de cadre, de sorte 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
Quelqu'un a demandé ce qui va se passer si clipToBounds est mis à false et maskToBounds est mis à true ou il peut être mieux si quelqu'un ajoute screenshots
je suis tombé sur la même question Où je voulais placer rayon coin et ombre à la fois à la vue.
mais ce n'est pas possible car dès que je mets masksToBound à Oui il supprime l'ombre mais clip le contenu et si je le mets à non il montre l'ombre mais ne clip le contenu.
j'ai fait le projet qui l'explique mieux la Compréhension de la ClipToBound Et MasksToBound
J'en suis venu à la conclusion que CALayer n'est pas un conteneur mais simplement une classe représentant un rectangle à l'écran avec un contenu visuel. chaque dessin fait sur UIView va sur CALayer ce qui provoque le contenu visuel de dessiner