Swift | Как применить градиент к UIButton и сделать текст жирным на кнопке?

Рейтинг: 0Ответов: 1Опубликовано: 03.02.2023

Всем привет! Хочу сделать кнопку с градиентом и жирным текстом, но как только я изменяю толшину и размер шрифта в кнопке, градиент пропадает. Если строчку с изменением шрифта комментирую, градиент появляется. Не могу понять в чем проблема, куда копать?

extension UIView {
        
        func applyGradient() {
            let lightBlue = UIColor(named: "lightBlue")!
            let blue = UIColor(named: "blue")!
            
            let gradient: CAGradientLayer = CAGradientLayer()
            gradient.frame = self.bounds
            gradient.colors = [lightBlue.cgColor, blue.cgColor]
            gradient.locations = [0.0, 1.1]
            self.layer.insertSublayer(gradient, at: 0)
        }
    }

class LoginViewController

private let loginButton: UIButton = {
    let button = UIButton()
    button.setTitle("Login", for: .normal)
    button.layer.cornerRadius = 20
    button.clipsToBounds = true
    button.titleLabel?.font = UIFont.systemFont(ofSize: 20, weight: .semibold) // !!!
    return button
}()

override func viewDidLayoutSubviews() {
    self.loginButton.applyGradient()
}

введите сюда описание изображения

введите сюда описание изображения

Ответы

▲ 0Принят

У вас не показано как вы выводите loginButton на экран, возможно дело в том как вы это делаете, вот пример где все работает

import UIKit

class ViewController: UIViewController {
    
    private let loginButton: UIButton = {
        let button = UIButton()
        button.setTitle("Login", for: .normal)
        button.layer.cornerRadius = 20
        button.clipsToBounds = true
        button.titleLabel?.font = UIFont.systemFont(ofSize: 20, weight: .semibold) // !!!
        return button
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.loginButton.frame = .init(x: 50, y: 50, width: 100, height: 40)
        view.addSubview(self.loginButton)
    }
    
    override func viewDidLayoutSubviews() {
        self.loginButton.applyGradient()
    }
    
}

extension UIView {
    
    func applyGradient() {
        let lightBlue = UIColor.lightGray
        let blue = UIColor.gray
        
        let gradient: CAGradientLayer = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = [lightBlue.cgColor, blue.cgColor]
        gradient.locations = [0.0, 1.1]
        self.layer.insertSublayer(gradient, at: 0)
    }
}