添加到 viewDidLayoutSubviews 时按钮渐变不起作用

Button gradient not working when added to viewDidLayoutSubviews

我正在使用以下代码添加按钮渐变

extension UIView {
    func applyGradient(colors: [UIColor]) {
        self.applyGradient(colors: colors, locations: nil)
    }

    func applyGradient(colors: [UIColor], locations: [NSNumber]?) {
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = colors.map { [=10=].cgColor }
        gradient.locations = locations
        gradient.startPoint = CGPoint(x: 0, y: 0)
        gradient.endPoint = CGPoint(x: 1, y: 0)
        self.layer.insertSublayer(gradient, at: 0)
    }
}

viewDidLayoutSubviews() 中调用 initStyle() 无效。

func initStyle() {
    submitBtn.applyGradient(colors: [#colorLiteral(red: 0.1176470588, green: 0.3882352941, blue: 0.5254901961, alpha: 1), #colorLiteral(red: 0.2941176471, green: 0.9098039216, blue: 0.9529411765, alpha: 1)])
    submitBtn.layer.cornerRadius = 15.0
    submitBtn.layer.masksToBounds = true
}

我正在以编程方式创建所有 UI 元素。我已正确设置约束并且正在运行。

lazy var submitBtn: UIButton = {
    let btn = UIButton(type: .system)
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.setTitle("SUBMIT", for: .normal)
    return btn
}()

如何让它工作?


仅当我将 initStyle() 放在 viewDidAppear() 而不是 viewDidLayoutSubviews() 时才显示渐变,这会导致按钮渐变显示延迟。我想避免这种延迟。所以我在viewDidLayoutSubviews中添加了它,但是后来没有出现渐变。

lazy var submitBtn: UIButton = {
    let btn = UIButton(type: .custom) //Set custom instead of system
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.setTitle("SUBMIT", for: .normal)
    return btn
}()

我认为这里的问题是 self.bounds 在您调用梯度函数时为 0。尝试稍后调用它,例如 viewWillAppear 或调用 view.layoutSubViews 来触发 iewDidLayoutSubviews()

尝试使用里面的函数 viewWillAppeare()

另外,为什么不在没有单独功能的情况下从一开始就将渐变应用于按钮?这将使按钮显示为已经内置的渐变。

如果你想设置渐变条件,你可以使用以下

func displayButton(condition: Bool){


lazy var submitBtn: UIButton = {
let btn = UIButton(type: .system)
btn.translatesAutoresizingMaskIntoConstraints = false
btn.setTitle("SUBMIT", for: .normal)

if condition == true {
//set the gradient here
return btn
} else if condition == false
return btn
}

}()



override func viewDidLoad(){
super.viewDidLoad()
 //here you can set the condition to show the gradient or not depending on what you want
displayButton(true) //will show the gradient
displayButton(false) // will show without gradient

}

我目前无法测试这段代码,所以我不确定,试一试。