Тень не появляется Swift 4.2 - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь добавить тень к кнопке с помощью swift. Я создал элементы на этом контроллере представления программно, и у меня есть ощущение, что по этой причине тень не появляется, потому что тени появляются в других моих контроллерах представления, которые есть в приложении. Я также пытался разобраться с clipToBounds и maskToBounds, но не смог это исправить. Чего мне не хватает?

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

let dateLabelButton: UIButton = {
    let button = UIButton()
    button.translatesAutoresizingMaskIntoConstraints = false

    button.layer.cornerRadius = 10
    button.backgroundColor = Colours().brightRedColour

    button.addTarget(self, action: #selector(segueToPopUp), for: .touchUpInside)

    let shadow = UIBezierPath(roundedRect: button.bounds, cornerRadius: 10).cgPath
    button.layer.shadowRadius = 5
    button.layer.shadowColor = UIColor.black.cgColor
    button.layer.shadowOpacity = 1
    button.layer.masksToBounds = false
    button.layer.shadowPath = shadow

    return button
}()

Вот ограничения, которые я добавил к этой кнопке.

// Sets up layout for date label button
    dateLabelButton.bottomAnchor.constraint(equalTo: self.view.topAnchor, constant: self.view.frame.height * 2/3 - 50).isActive = true
    dateLabelButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
    dateLabelButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true
    dateLabelButton.topAnchor.constraint(equalTo: barChart.bottomAnchor, constant: 10).isActive = true
    dateLabelButton.heightAnchor.constraint(equalToConstant: 40).isActive = true

Любая помощь была бы великолепна, я пытаюсь это часами и просто не могу понять.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Если вы используете UIBezierPath для тени, вам нужно сделать это внутри viewDidLayoutSubviews(), вот так:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let shadow = UIBezierPath(roundedRect: dateLabelButton.bounds, cornerRadius: 10).cgPath
    dateLabelButton.layer.shadowRadius = 5
    dateLabelButton.layer.shadowColor = UIColor.black.cgColor
    dateLabelButton.layer.shadowOpacity = 1
    dateLabelButton.layer.masksToBounds = false
    dateLabelButton.layer.shadowPath = shadow
}

В противном случае, вы можете просто закомментировать ваш shadowPath так же, как ответ Enea.

0 голосов
/ 18 января 2019

Я думаю, это будет работать.

let dateLabelButton: UIButton = {
    let button = UIButton()
    button.translatesAutoresizingMaskIntoConstraints = false

    button.layer.cornerRadius = 10
    button.backgroundColor = Colours().brightRedColour

    button.addTarget(self, action: #selector(segueToPopUp), for: .touchUpInside)

    //let shadow = UIBezierPath(roundedRect: button.bounds, cornerRadius: 10).cgPath
    button.layer.shadowRadius = 5
    button.layer.shadowColor = UIColor.black.cgColor
    button.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
    button.layer.shadowOpacity = 1.0
    button.layer.masksToBounds = false
   // button.layer.shadowPath = shadow

    return button
}()
...