【问题标题】:change tint color of button image on different states在不同状态下更改按钮图像的色调颜色
【发布时间】:2015-11-10 10:38:07
【问题描述】:

您好,我有一个无法解决的问题。我写了一个扩展来帮助我为透明的 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)

不知何故,它只需要最后一个状态。所以在这种情况下,高亮状态被忽略。我在这里错过了什么?

【问题讨论】:

    标签: swift uibutton


    【解决方案1】:

    这可以通过继承 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)。

    【讨论】:

      【解决方案2】:

      当您按下时会调用 Highlighted,您是否尝试过选择状态?此外,您应该将 selected 布尔值设置为 true。

      否则,它会简单地返回正常状态,因此,颜色为灰色。

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

      【讨论】:

      • 它不必保持选中状态。就在我按下它时,它应该会瞬间变为黄色,以向用户显示它已被点击。
      【解决方案3】:

      我不能告诉你你想要做什么的解决方案,但我可以告诉你你的代码有什么问题:

      在这里你正在为一个状态设置图像:

      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。

      抱歉,我还没有解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 2014-03-14
        相关资源
        最近更新 更多