1. ホーム
  2. ios

[解決済み] なぜmasksToBounds = YESはCALayerの影を防ぐのか?

2023-05-13 11:16:05

質問

次のスニペットで、私は1つのUIViewにドロップシャドウ効果を追加しています。これはかなりうまく動作します。しかし、私が設定するとすぐにビューの masksToBounds プロパティを YES . ドロップシャドウの効果はもうレンダリングされません。

self.myView.layer.shadowColor = [[UIColor blackColor] CGColor];
self.myView.layer.shadowOpacity = 1.0;
self.myView.layer.shadowRadius = 10.0;
self.myView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
self.myView.layer.cornerRadius = 5.0;
self.myView.layer.masksToBounds = YES; // <-- This is causing the Drop shadow to not be rendered
UIBezierPath *path = [UIBezierPath bezierPathWithCurvedShadowForRect:self.myView.bounds];
self.myView.layer.shadowPath = path.CGPath;
self.myView.layer.shouldRasterize = YES;

これに関して何かアイデアはありますか?

どのように解決するのですか?

シャドウはViewの外側で行われる効果なので、masksToBoundsをYESに設定することで、UIViewに自分の外側にあるものを描画しないように伝えることができるからです。

シャドウを使ったRoundedCornerビューが必要な場合は、2つのビューで行うことをお勧めします。

UIView *view1 = [[UIView alloc] init];
UIView *view2 = [[UIView alloc] init];

view1.layer.cornerRadius = 5.0;
view1.layer.masksToBounds = YES;
view2.layer.cornerRadius = 5.0;
view2.layer.shadowColor = [[UIColor blackColor] CGColor];
view2.layer.shadowOpacity = 1.0;
view2.layer.shadowRadius = 10.0;
view2.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
[view2 addSubview:view1];
[view1 release];