Подтвердить что ты не робот

Тень не отображается, когда цвет фона прозрачный

Я создал uiview в своем xib с цветом фона в качестве четкого цвета. Когда я применяю тень на слое представления, тень не появляется. Но когда я устанавливаю цвет фона, отличный от прозрачного цвета, отображается тень. Пожалуйста, помогите.

это мой код

self.cView.layer.shadowColor=[UIColor whiteColor].CGColor;
self.cView.layer.shadowOffset=CGSizeZero;
self.cView.layer.shadowRadius=30.0;
self.cView.layer.shadowOpacity=1.0;
self.cView.layer.cornerRadius=10.0;
4b9b3361

Ответ 1

Проблема заключается в том, что тень фактически учитывает "верхний" уровень. Если там ничего нет, тени не будут: Как работают тени...

EDIT:

Этот рецепт скопирован из папки вставки

view.layer.shadowColor = [UIColor colorWithWhite:.5 alpha:1].CGColor;
view.layer.shadowRadius = 4.0f;
view.layer.shadowPath = CGPathCreateWithRect(CGRectMake(0, 0, 50, 50), NULL);
view.layer.shadowOpacity = 1.0f;
view.layer.shadowOffset = CGSizeMake(1, 1);

Но я сомневаюсь, что это будет полезно для вас: результатом является "нарисованное" изображение с цветом тени и тень вокруг него.

Ответ 2

Если вы укажете свойство shadowPath

shadowView.layer.shadowPath =
  UIBezierPath(
   roundedRect: shadowView.bounds,
   cornerRadius: 10).cgPath

(или любой другой angular радиус.)

это будет работать даже с .clear backgroundColor.

Обратите внимание, что вы, конечно, должны сделать это в layoutSubviews рассматриваемого представления.

Вот фактический рабочий пример:

import UIKit

@IBDesignable class LonelyShadow: UIView {

    let corner: CGFloat = 20

    override init(frame: CGRect) {
        super.init(frame: frame)
        common()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        common()
    }

    private func common() {

        backgroundColor = .clear
        clipsToBounds = false

        layer.shadowColor = UIColor.yourColor.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 25)
        layer.shadowOpacity = 0.3
        layer.shadowRadius = 40
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        layer.shadowPath = UIBezierPath(
          roundedRect: bounds, cornerRadius: corner).cgPath
    }
}

Ответ 3

Разве вы не забыли установить self.cView.clipToBounds на NO?

Ответ 4

Эквивалентно ответу @Rok Jark в Swift 4:

self.layer.shadowColor = UIColor(white: 0.5, alpha: 1).cgColor
self.layer.shadowRadius = 4.0
self.layer.shadowPath = CGPath.init(rect: CGRect.init(x: 0, y: 0, width: 50, height: 50), transform: nil)
self.layer.shadowOpacity = 1.0;
self.layer.shadowOffset = CGSize(width: 1, height: 1)