У меня есть кнопка с системным образом:

@IBOutlet weak var ampouleButton: UIButton!

В viewdidload я поместил это:

let ampouleButtonConfig = UIImage.SymbolConfiguration(
            pointSize: 30,
            weight: .regular,
            scale: .large)
        
        let ampouleButtonImage = UIImage(
            systemName: "lightbulb",
            withConfiguration: ampouleButtonConfig)
        
        ampouleButton.backgroundColor = Theme.gold03 // i need to put here a gradient
        ampouleButton.setImage(ampouleButtonImage, for: .normal)
        ampouleButton.tintColor = Theme.blanc
        ampouleButton.layer.cornerRadius = ampouleButton.frame.height / 2
        ampouleButton.layer.shadowOpacity = 0.4
        ampouleButton.layer.shadowRadius = 3
        ampouleButton.layer.shadowOffset =
            CGSize(width: 0, height: 5)
        ampouleButton.alpha = 1

Вместо цвета фона мне нужно поставить градиент.

Я тестировал это, но это не сработало:

let gradientLayer = CAGradientLayer()
            gradientLayer.frame = self.ampouleButton.bounds
            gradientLayer.colors = [UIColor.yellow.cgColor, UIColor.white.cgColor]
        ampouleButton.layer.insertSublayer(gradientLayer, at: 0)

-1
Wahib 11 Дек 2020 в 07:36

1 ответ

Лучший ответ

На самом деле изображение кнопки находится за слоем. Попробуй это:

extension UIButton {
    func applyGradient(colors: [CGColor], radius: CGFloat = 0, startGradient: CGPoint = .init(x: 0.5, y: 0), endGradient: CGPoint = .init(x: 0.5, y: 1)) {
        // check first if there is already a gradient layer to avoid adding more than one
            let gradientLayer = CAGradientLayer()
            gradientLayer.cornerRadius = radius
            gradientLayer.colors = colors
            gradientLayer.startPoint = startGradient
            gradientLayer.endPoint = endGradient
            gradientLayer.frame = bounds
            layer.insertSublayer(gradientLayer, at: 0)
    }
}

И в viewDidLoad поставьте:

ampouleButton.applyGradient(colors: [Theme.bleu!.cgColor, Theme.softBlue!.cgColor], radius: self.ampouleButton.frame.height / 2, startGradient: CGPoint(x: 0, y: 0.5), endGradient: CGPoint(x: 1, y: 0)) 
if let imgView = ampouleButton.imageView { ampouleButton.bringSubviewToFront(imgView) }

Найдите функцию applyGradient отсюда: https://stackoverflow.com/a/62093932/2303865

2
Wahib 11 Дек 2020 в 06:08