渐变颜色不会根据Button isSelected State而改变

时间:2017-10-25 11:39:58

标签: ios swift uibutton gradient

我制作了一个自定义渐变按钮,这样我就可以在不同的状态下更改渐变颜色:

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)
}

运行此代码时,按钮背景清晰。没有渐变显示。

修改

如同建议的评论:

buttongradient.frame = self.bounds

是解决方案。

跟进问题

现在我意识到,渐变不会根据isSelected状态改变颜色。

1 个答案:

答案 0 :(得分:0)

存在多个问题:

  1. 正如您现在所知,您必须使用.seek(0)来更新图层框架。
  2. 无需更改初始值设定项中的图层。在呈现之前始终会调用self.bounds
  3. 如果您的目标是在按下按钮时更改颜色,则需要使用layoutSubviews,而不是isHighlighted
  4. 每个布局都会重写您的颜色值,从布局方法中删除isSelected
  5. 无需使用字符串进行十六进制颜色定义。我建议使用整数,例如buttongradient.colors(见How to use hex colour values)。
  6. 0x29a1e2
相关问题