添加到 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
}
我目前无法测试这段代码,所以我不确定,试一试。
我正在使用以下代码添加按钮渐变
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
}
我目前无法测试这段代码,所以我不确定,试一试。