Тень не отображается, когда цвет фона прозрачный
Я создал 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;
Ответы
Ответ 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)