Swift 更改按钮图像在不同状态下的着色颜色

Swift 更改按钮图像在不同状态下的着色颜色,swift,uibutton,Swift,Uibutton,嗨,我有个问题想不出来。我已经写了一个扩展,帮助我着色透明PNG的 extension UIButton { func setImageColorForState(image: UIImage, color: UIColor, forState: UIControlState) { let temp = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) setImage(te

嗨,我有个问题想不出来。我已经写了一个扩展,帮助我着色透明PNG的

extension UIButton {
    func setImageColorForState(image: UIImage, color: UIColor, forState: UIControlState) {
        let temp = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
        setImage(temp, forState: forState)
        tintColor = color
    }
}
我使用扩展名如下:

btn.setImageColorForState(originalImage!, color: UIColor.yellowColor(), forState: .Highlighted)
btn.setImageColorForState(originalImage!, color: UIColor.grayColor(), forState: .Normal)

不知何故,它只需要最后一个状态。因此,在这种情况下,高亮显示状态将被忽略。我在这里遗漏了什么?

当您按下时,突出显示的内容将被调用,您是否尝试使用所选状态?此外,还应将所选布尔值设置为true

否则,它将简单地恢复到正常状态,因此具有灰色


您也可以参考此项:

我无法告诉您尝试执行的操作的解决方案,但我可以告诉您的代码有什么问题:

在这里,您正在为状态设置图像:

let temp = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
setImage(temp, forState: forState)
在这里您可以设置颜色。但颜色与特定状态无关。它影响按钮的所有状态

tintColor = color
所以如果你把这个叫做

btn.setImageColorForState(originalImage!, color: UIColor.yellowColor(), forState: .Highlighted)
btn.setImageColorForState(originalImage!, color: UIColor.grayColor(), forState: .Normal)
。。。您只需覆盖淡色


请注意,我还没有解决您的问题的方法。

这可以通过子类化UIButton并重写isHighlighted变量来实现,类似于此处接受的答案()

或者,相当于:

    override open var isHighlighted: Bool {
        didSet {
            if (isHighlighted) { self.tintColor = UIColor.red }
            else { self.tintColor = UIColor.gray }
        }
这是一个老问题,但我还是写了这篇文章,以防有人发生类似的事情。使用Swift 3.2和4.0进行测试



尽管目前可以跳过子类化部分,并对UIButton扩展执行相同的操作,但不应该这样做()。

它不必保持选中状态。就在我按下它的时候,它会在一瞬间变为黄色,向用户显示它被点击了。
    override open var isHighlighted: Bool {
        didSet {
            if (isHighlighted) { self.tintColor = UIColor.red }
            else { self.tintColor = UIColor.gray }
        }