Установить только тень на нижнем 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