web-dev-qa-db-ja.com

UIViewのclipsToBoundsとCALayerのmasksToBoundsの関係はどうですか?

UIViewにはCALayerがあります。それはかなり確かです。しかし、どちらも同じことを意味する何かを提供しているようです。

clipsToBounds=YESを設定した場合、レイヤーのmasksToBounds=YESも設定されますか?なぜ違う名前なの?誰もが知っていますか?

55
Thanks

UIViewCALayerは異なり、関連する用語も異なるため、これらは異なる名前ですが、機能的には同等です。 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
116
Louis Gerbarg

ClipToBoundsがfalseに設定され、maskToBoundsがtrueに設定されている場合、または誰かがスクリーンショットを追加した方がよい場合はどうなるかを尋ねた人がいます。

コーナー半径とシャドウの両方をビューに設定したいという同じ問題に遭遇しました。

ただし、masksToBoundをYESに設定するとすぐに影が削除されますが、コンテンツがクリップされます。NOに設定すると、影が表示されますが、コンテンツはクリップされません。

私はそれをよりよく説明するプロジェクトを作りました ClipToBoundとMasksToBoundを理解する

CALayerはコンテナではなく、視覚的なコンテンツを含む画面上の長方形を表すクラスであるという結論に達しました。 UIViewで行われるすべての描画はCALayerで行われるため、ビジュアルコンテンツが描画されます

masksToBound set to NOmasksToBound set to YES

3
Vikram Sinha