【发布时间】:2023-03-26 01:50:01
【问题描述】:
我做了一个自定义渐变按钮,这样我就可以在不同的状态下改变渐变颜色:
class GradientButton: UIButton {
public var buttongradient: CAGradientLayer = CAGradientLayer()
override var isSelected: Bool {
didSet {
if isSelected {
buttongradient.colors = [UIColor(hexString: "#ef473a")!, UIColor(hexString: "#cb2d3e")!].map { $0.cgColor }
} else {
buttongradient.colors = [UIColor(hexString: "#29a1e2")! , UIColor(hexString: "#485ac8")!].map { $0.cgColor }
}
}
}
override init(frame: CGRect) {
super.init(frame: frame)
self.addthegradientLayer()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.addthegradientLayer()
}
override func layoutSubviews() {
super.layoutSubviews()
self.addthegradientLayer()
}
func addthegradientLayer() {
//the cells gradient colors
buttongradient.frame = self.bounds
buttongradient.cornerRadius = buttongradient.frame.height / 2
buttongradient.colors = [UIColor(hexString: "#29a1e2")! , UIColor(hexString: "#485ac8")!].map { $0.cgColor }
buttongradient.startPoint = CGPoint(x: 1.0, y: 0.0)
buttongradient.endPoint = CGPoint(x: 0.0, y: 1.0)
self.layer.insertSublayer(buttongradient, at: 0)
}
当我运行这段代码时,按钮背景是清晰的。没有渐变显示。
编辑
如 cmets 建议的那样:
buttongradient.frame = self.bounds
是解决方案。
跟进问题
现在我意识到,渐变不会根据 isSelected 状态改变颜色。
【问题讨论】:
-
buttongradient.frame = self.frame=>buttongradient.frame = self.bounds似乎更好。 -
这就是解决方案!
-
只有在边界确实发生变化时才应该更新梯度,否则您将遇到巨大的性能问题。我知道是因为我最近在修一个类似的。您可能还想使用
isHighlighted而不是isSelected。
标签: ios swift uibutton gradient