嗨,我有一个我无法弄清楚的问题。我写了一个扩展,帮助我着色透明的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)
不知何故,它只需要最后一个状态。因此,在这种情况下,忽略突出显示状态。我在这里缺少什么?
答案 0 :(得分:0)
当您按下时,会调用突出显示,您是否尝试过选择状态?此外,您应将选定的布尔值设置为true。
否则,它将简单地返回到正常状态,因此具有灰色。
答案 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)。