1. ホーム
  2. ios

[解決済み] UIViewにドロップシャドウを追加する最適な方法は?

2022-11-25 15:30:41

質問

私は、互いに重なり合ったビューにドロップシャドウを追加しようとしていますが、ビューは他のビューのコンテンツを見ることができるように崩壊します。 view.clipsToBounds をオンにしておき、ビューが折りたたまれたときにそのコンテンツが切り取られるようにしたいのです。

これは、レイヤーにドロップシャドウを追加することを難しくしているようです。 clipsToBounds をオンにすると、影も切り取られます。

を操作してみたのですが view.frameview.bounds を使用して、フレームにドロップ シャドウを追加し、それを包含するのに十分な大きさの境界を許可する必要がありますが、これには失敗しました。

シャドウを追加するために使用しているコードは次のとおりです (このコードは clipsToBounds OFFで動作します)

view.clipsToBounds = NO;
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowOffset = CGSizeMake(0,5);
view.layer.shadowOpacity = 0.5;

これは、一番明るいグレーのレイヤーに影を適用したときのスクリーンショットです。このスクリーンショットを見れば、次のような場合にコンテンツがどのように重なるかがわかると思います。 clipsToBounds がオフの場合に、コンテンツがどのように重なるかを示しています。

の影を付けるにはどうしたらよいでしょうか。 UIView に影を付け、コンテンツを切り取ったままにするにはどうしたらよいでしょうか?

編集:私はまた、影をつけた背景画像を使用して遊んでいることを追加したかったのですが、それはうまく機能します。

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

これを試してみてください。

UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:view.bounds];
view.layer.masksToBounds = NO;
view.layer.shadowColor = [UIColor blackColor].CGColor;
view.layer.shadowOffset = CGSizeMake(0.0f, 5.0f);
view.layer.shadowOpacity = 0.5f;
view.layer.shadowPath = shadowPath.CGPath;

まず最初に : は UIBezierPath として使われる shadowPath は重要です。 これを使用しない場合、最初は違いに気づかないかもしれませんが、鋭い観察眼で、デバイスの回転などのイベント時に発生する一定の遅延を観察できます。これは重要なパフォーマンス調整です。

あなたの問題に関して特に : 重要な行は view.layer.masksToBounds = NO . これは ビューのレイヤーのサブレイヤー のクリッピングを無効にします。

の違いは何なのでしょうか? masksToBounds (レイヤー上) とビュー自身の clipToBounds というプロパティがあります。実はないんです。一方を切り替えると、他方にも影響があります。ただ、抽象化のレベルが違うだけです。


Swift 2.2です。

override func layoutSubviews()
{
    super.layoutSubviews()

    let shadowPath = UIBezierPath(rect: bounds)
    layer.masksToBounds = false
    layer.shadowColor = UIColor.blackColor().CGColor
    layer.shadowOffset = CGSizeMake(0.0, 5.0)
    layer.shadowOpacity = 0.5
    layer.shadowPath = shadowPath.CGPath
}


Swift 3です。

override func layoutSubviews()
{
    super.layoutSubviews()

    let shadowPath = UIBezierPath(rect: bounds)
    layer.masksToBounds = false
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOffset = CGSize(width: 0.0, height: 5.0)
    layer.shadowOpacity = 0.5
    layer.shadowPath = shadowPath.cgPath
}