Добавление нескольких теней скрывает цвет фона и кнопку пользовательского интерфейса текста. - PullRequest
0 голосов
/ 18 февраля 2020

Я пытался добавить несколько теней к кнопке UIB. Мои две тени были добавлены, как вы можете видеть на изображении. Тем не менее, они скрывают название и цвет фона UIButton. Почему это происходит? Итак, порядок слоев стал нижний слой, верхний слой, текст и фон?

Фактический результат

enter image description here

Ожидаемый результат

enter image description here

Вот так выглядит мой класс кнопок пользовательского интерфейса.

class PrimaryButton: UIButton {

    let cornerRadius: CGFloat = 10

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    convenience init() {
        self.init(frame: .zero)
        configure()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        addDropShadow()
    }

    private func configure() {
        backgroundColor = .white;
        layer.cornerRadius = cornerRadius

        setTitle("Get Followers", for: .normal)
        setTitleColor(Colours.buttonTextColour, for: .normal)
    }

    private func addDropShadow() {
        let topLayer = createShadowLayer(color: Colours.shadowWhite, offset: CGSize(width: -6, height: -6))
        let bottomLayer = createShadowLayer(color: Colours.shadowBlack, offset: CGSize(width: 6, height: 6))

        layer.addSublayer(topLayer)
        layer.addSublayer(bottomLayer)
    }

    private func createShadowLayer(color: UIColor, offset: CGSize) -> CALayer {
        let shadowLayer = CALayer()
        shadowLayer.masksToBounds = false
        shadowLayer.shadowColor = color.cgColor
        shadowLayer.shadowOpacity = 1
        shadowLayer.shadowOffset = offset
        shadowLayer.shadowRadius = 10
        shadowLayer.shouldRasterize = true
        shadowLayer.shadowPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: 10).cgPath

        return shadowLayer
    }

}

1 Ответ

3 голосов
/ 25 февраля 2020

Здравствуйте, приведенный ниже код поможет вам, я получил точный результат, что вы хотите в тени кнопок

, просто замените некоторую функцию моим кодом,

Ваш код:

override func layoutSubviews() {

    super.layoutSubviews()
    addDropShadow()
}

Замените его на мой код:

 override func layoutSubviews() {
        super.layoutSubviews()
        addDropShadow(color: UIColor.red, offset: CGSize(width: -6, height: -6), btnLayer: self.layer)
        addDropShadow(color: UIColor.blue, offset: CGSize(width: 6, height: 6), btnLayer: self.layer)
    }

Ваш код:

 private func addDropShadow() {
        let topLayer = createShadowLayer(color: Colours.shadowWhite, offset: CGSize(width: -6, height: -6))
        let bottomLayer = createShadowLayer(color: Colours.shadowBlack, offset: CGSize(width: 6, height: 6))

    layer.addSublayer(topLayer)
    layer.addSublayer(bottomLayer)
}

private func createShadowLayer(color: UIColor, offset: CGSize) -> CALayer {
    let shadowLayer = CALayer()
    shadowLayer.masksToBounds = false
    shadowLayer.shadowColor = color.cgColor
    shadowLayer.shadowOpacity = 1
    shadowLayer.shadowOffset = offset
    shadowLayer.shadowRadius = 10
    shadowLayer.shouldRasterize = true
    shadowLayer.shadowPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: 10).cgPath

    return shadowLayer
}

Замените его следующим кодом:

 private func addDropShadow(color: UIColor, offset: CGSize, btnLayer : CALayer)
    {

        btnLayer.masksToBounds = false
        btnLayer.shadowColor = color.cgColor
        btnLayer.shadowOpacity = 1
        btnLayer.shadowOffset = offset
        btnLayer.shadowRadius = 10

    }

Вам не нужно private func createShadowLayer(color: UIColor, offset: CGSize) -> CALayer

вы можете удалить эту функцию.

и убедиться, что ваш тип кнопки является пользовательским

...