Я пытаюсь добавить тень к кнопке, но тень добавляется к тексту кнопки вместо всей кнопки:

enter image description here

Нужно ли использовать код для достижения этой цели? Или это проблема размеров? Я мог бы добавить размер тени на раскадровке, но я не вижу, где установить, если он должен идти вокруг кнопки

5
breakline 4 Мар 2018 в 21:43

4 ответа

Лучший ответ

Это потому, что фон вашей кнопки прозрачный .
Когда вы устанавливаете тень на UIView с прозрачным фоном, тень применяется ко всем его подпредставлениям (а не вокруг самого UIView). В вашем случае у вас есть UIButton с прозрачным фоном , поэтому тень применяется к всем видимым подпредставлениям , который в этом случае только его titleLabel .
Итак, у вас есть два решения здесь:
1) Измените цвет фона кнопки на что-то другое
2) Непосредственно укажите shadowPath:
button.layer.shadowPath = UIBezierPath(rect: button.layer.bounds).cgPath

3
arturdev 5 Мар 2018 в 05:52

Я не очень разбираюсь в раскадровке, но используя свойства слоя ниже, вы можете установить тень. Вы можете играть вокруг кнопки.

Я пробую приведенный ниже код и изменяю значения в зависимости от ваших требований и придаю вашей кнопке некоторый цвет

    //button is your button name
    button.backgroundColor = self.view.backgroundColor
    button.layer.shadowOpacity = 0.3
    button.layer.shadowRadius = 2.0
    button.layer.shadowColor = UIColor.yellow.cgColor
    button.layer.cornerRadius = 2
1
Iraniya Naynesh 4 Мар 2018 в 19:23

Вот два метода расширения, чтобы добавить тень

extension UIView {
func setRadiusWithShadow(_ radius: CGFloat? = nil) { // this method adds shadow to right and bottom side of button
    self.layer.cornerRadius = radius ?? self.frame.width / 2
    self.layer.shadowColor = UIColor.darkGray.cgColor
    self.layer.shadowOffset = CGSize(width: 1.5, height: 1.5)
    self.layer.shadowRadius = 1.0
    self.layer.shadowOpacity = 0.7
    self.layer.masksToBounds = false
}

func setAllSideShadow(shadowShowSize: CGFloat = 1.0) { // this method adds shadow to allsides
    let shadowSize : CGFloat = shadowShowSize
    let shadowPath = UIBezierPath(rect: CGRect(x: -shadowSize / 2,
                                               y: -shadowSize / 2,
                                               width: self.frame.size.width + shadowSize,
                                               height: self.frame.size.height + shadowSize))
    self.layer.masksToBounds = false
    self.layer.shadowColor = UIColor.lightGray.withAlphaComponent(0.8).cgColor
    self.layer.shadowOffset = CGSize(width: 0.0, height: 0.0)
    self.layer.shadowOpacity = 0.5
    self.layer.shadowPath = shadowPath.cgPath
}
}

shadows to button

 self.view.layoutIfNeeded() // need this method to layout your run time button frame before giving shadow

Первая кнопка со всей боковой тенью

self.recordMeasurementWrapperView.setAllSideShadow(shadowShowSize: 3.0)

Вторая кнопка с тенью только снизу и справа

self.retakeMeasurementWrapperView.setRadiusWithShadow(2.0)
1
Ashwin Shrestha 5 Мар 2018 в 04:33

Тень дается на всю кнопку. Дело в том, что у самой кнопки есть backgroundColor == .clear, что означает, что она не создает тени (только непрозрачная часть ее является ее заголовком, таким образом, это только часть, которая создает тень).

В вашем случае установите цвет фона кнопки на тот же цвет, что и у ее суперпредставления, и вы получите то, что хотите.

1
Milan Nosáľ 4 Мар 2018 в 19:43