web-dev-qa-db-ja.com

CALayerシャドウがサブビューに影響を与えないようにしますか?

カスタムのUIControlがあり、シャドウを付けたいので、そのlayerに関連するプロパティを設定します。必要に応じてビューの周囲に影が表示されますが、サブビューであるUILabelのテキストの下にも影が表示されます。どうやってこれを止めますか?外側のスーパービューの周りの影だけが欲しいです。

enter image description here

...
init() {        
    label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    self.translatesAutoresizingMaskIntoConstraints = false
    addSubview(label)

    self.layer.masksToBounds = false
    self.layer.shadowColor = UIColor.blackColor().CGColor
    self.layer.shadowOpacity = 1.0
    self.layer.shadowRadius = 2.0

    // Adding these lines trying to explicitly stop shadow on label...
    label.layer.shadowOpacity = 0
    label.layer.shadowColor = nil
    ...
}
25
Rob N

これは、親ビューのアルファが1.0未満であるか、背景色がない(つまり、クリアカラーに設定されている)場合に発生します。その場合、シャドウはサブビューに変換されます。詳細については、私の答えを参照してください ここ

Apple Docs これを証明する:

図A-7は、赤い影が適用された同じサンプルレイヤーのいくつかの異なるバージョンを示しています。左バージョンと中央バージョンには背景色が含まれているため、シャドウはレイヤーの境界の周りにのみ表示されます。ただし、右のバージョンには背景色が含まれていません。この場合、シャドウはレイヤーのコンテンツ、境界線、およびサブレイヤーに適用されます。

Shadow

75
NKorotkov

サブビューの親を変更するだけで簡単です。

つまり、透明なシャドウビューの上に新しい親を作成し、この新しい親ビューにサブビューを挿入します。

0
jamal zare