改变不同状态下按钮图像的色调

时间:2015-11-10 10:38:08

标签: swift uibutton

嗨,我有一个我无法弄清楚的问题。我写了一个扩展,帮助我着色透明的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)

不知何故,它只需要最后一个状态。因此,在这种情况下,忽略突出显示状态。我在这里缺少什么?

3 个答案:

答案 0 :(得分:0)

当您按下时,会调用突出显示,您是否尝试过选择状态?此外,您应将选定的布尔值设置为true。

否则,它将简单地返回到正常状态,因此具有灰色。

你也可以参考这个:Keeping a UIButton selected after a touch

答案 1 :(得分:0)

我无法告诉您解决方案,但我可以告诉您代码的错误:

您在此处设置状态图像:

let temp = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
setImage(temp, forState: forState)

在这里你正在设置TintColor。但TintColor与特定状态无关。它会影响按钮的所有状态。

tintColor = color

所以如果你打电话给这个......

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

...你只需覆盖TintColor。

我还没解决你的问题。

答案 2 :(得分:0)

这可以通过子类化UIButton并覆盖isHighlighted变量来完成,类似于此处接受的答案(https://stackoverflow.com/a/17602296/4673023)。

    override open var isHighlighted: Bool {
        didSet {
            self.tintColor = isHighlighted ? UIColor.red : UIColor.gray
        }
    }

或等效地:

    override open var isHighlighted: Bool {
        didSet {
            if (isHighlighted) { self.tintColor = UIColor.red }
            else { self.tintColor = UIColor.gray }
        }

这是一个古老的问题,但是我还是写了这个,以防有人发生类似的事情。经过Swift 3.2和4.0的测试。


尽管目前可以跳过子类化部分,并使用UIButton扩展名做同样的事情,但不应该这样做(https://docs.swift.org/swift-book/LanguageGuide/Extensions.html)。