Установить только тень на нижнем UIView
Я хочу создать нижнюю тень на UIView. Прямо сейчас с помощью этой функции создается тень сверху, снизу, слева и справа.
func setCardView(view : UIView){
view.layer.masksToBounds = false
view.layer.shadowOffset = CGSize(width: 0, height: 0)
view.layer.shadowRadius = 2
view.layer.shadowOpacity = 0.5
}
Можно ли вообще создать тень внизу?
Любая помощь будет оценена по достоинству. Спасибо!
Ответы
Ответ 1
Я думаю, что правильный подход к тени - это то, что тень принадлежит объекту, который является кнопкой, видом, а не просто частью стороны. Воображая, что есть виртуальный источник света. Вы не можете просто создать тень для одной стороны.
С учетом сказанного, тень всегда будет тенью всего взгляда. Однако вы можете изменить смещение тени, чтобы оно было направлено вниз.
view.layer.shadowOffset = CGSize(width: 0, height: 3)
Это означает, что вы хотите, чтобы источник света снимал свет сверху, а тень - снизу. Причиной, по которой вы все еще видите тень сверху, является радиус тени. который должен имитировать diffuse
свет. Чем более рассеянный свет, тем мягче будет тень, и вы все равно увидите верхнюю тень.
view.layer.shadowRadius = 1 or 0.5
попытаться уменьшить радиус также. это даст вам лучший визуальный результат.
Чтобы понять умбру, полутень и антумбру, если вам нужно, посмотрите https://en.wikipedia.org/wiki/Umbra,_penumbra_and_antumbra
Ответ 2
Измените shadowOffset
view.layer.shadowOffset = CGSize(width: 0, height: 3)
Ответ 3
Здесь правильный способ применения тени в Swift:
yourView.layer.shadowOffset = CGSize(width: 0, height: 3)
yourView.layer.shadowOpacity = 0.6
yourView.layer.shadowRadius = 3.0
yourView.layer.shadowColor = UIColor.red.cgColor
Ответ 4
Этот код работает для Swift 4 и тени, применяемой для просмотра снизу:
view.layer.masksToBounds = false
view.layer.shadowRadius = 4
view.layer.shadowOpacity = 1
view.layer.shadowColor = UIColor.gray.cgColor
view.layer.shadowOffset = CGSize(width: 0 , height:2)
Ответ 5
Если вы действительно хотите, чтобы тень была только на одной стороне вашего UIView
, вы должны установить свой view.layer.shadowPath
в UIBezierPath
.
Вот пример, который будет отображать тень только в нижней части вида:
view.layer.shadowPath = UIBezierPath(rect: CGRect(x: 0,
y: bounds.maxY - layer.shadowRadius,
width: bounds.width,
height: layer.shadowRadius)).cgPath
Деконструируя значение CGRect
, вы получите:
-
x
и width
гарантируют, что тень занимает всю горизонтальную ширину вашего вида (вы можете настроить их, например, используя значение layer.shadowRadius
в качестве основы для вашего смещения) -
y
и height
гарантируют, что тень начинается настолько низко, насколько это возможно, а затем становится такой же большой, как радиус
Конечно, в некоторых случаях это не сработает, например, когда вы хотите, чтобы shadowRadius
больше, чем height
вашего вида. В этих случаях я бы рекомендовал использовать вид изображения или маскированный слой.
Надеюсь это поможет,
Ответ 6
Старый вопрос, но, кажется, ни один из ответов не отвечает на этот вопрос. Хотя приведенные выше ответы будут работать с низким shadowRadius
, на самом деле вы не получите эффекта 'shadow'.
Вы можете абсолютно добавить тень только снизу, используя UIBezierPath
Вот как -
let shadowWidth: CGFloat = 1.2 // Shadow width, will be the width furthest away from the view, this is equivalent to 120% of the views width
let shadowHeight: CGFloat = 0.3 // Shadow height, again this is equivalent to 30%
let shadowRadius: CGFloat = 5
let width = someView.frame.width
let height = someView.frame.height // Get width and height of the view
// Plot the path
let shadowPath = UIBezierPath()
shadowPath.move(to: CGPoint(x: shadowRadius / 2, y: height - shadowRadius / 2))
shadowPath.addLine(to: CGPoint(x: width - shadowRadius / 2, y: height - shadowRadius / 2))
shadowPath.addLine(to: CGPoint(x: width * shadowWidth, y: height + (height * shadowHeight)))
shadowPath.addLine(to: CGPoint(x: width * -(shadowWidth - 1), y: height + (height * shadowHeight)))
// Add shadow
someView.layer.shadowPath = shadowPath.cgPath
someView.layer.shadowRadius = shadowRadius
someView.layer.shadowOffset = .zero
someView.layer.shadowOpacity = 0.2
Это выводит это
![enter image description here]()
Или, если вы хотите более простое решение, с меньшим количеством опций, вы можете пойти с этим
let buttonHeight = someButton.frame.height
let buttonWidth = someButton.frame.width
let shadowSize: CGFloat = 15
let contactRect = CGRect(x: -shadowSize, y: buttonHeight - (shadowSize * 0.2), width: buttonWidth + shadowSize * 2, height: shadowSize)
someButton.layer.shadowPath = UIBezierPath(ovalIn: contactRect).cgPath
someButton.layer.shadowRadius = 5
someButton.layer.shadowOpacity = 0.6
Который выведет это
![enter image description here]()
Пример здесь
https://github.com/hemo87/ExampleShadow/tree/master