在状态更改时更改按钮颜色

Posted

技术标签:

【中文标题】在状态更改时更改按钮颜色【英文标题】:Change Button Color on state change 【发布时间】:2018-02-26 09:45:45 【问题描述】:

我希望按钮在突出显示时具有白色背景和蓝色标题。我有一个 UIButton 的扩展来设置它的背景颜色。

extension UIButton 
    func setBackgroundColor(color: UIColor, forState: UIControlState) 
        UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
        UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
        UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
        let colorImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        self.setBackgroundImage(colorImage, for: forState)
        self.clipsToBounds = true
    


在下一个函数中,我设置了一个特定的按钮。

private func stylizingButton(button: UIButton)
        button.layer.borderWidth = 2
        button.layer.borderColor = textColor.cgColor
        button.layer.cornerRadius = 8
        button.setTitleColor(textColor, for: .normal)

        button.setTitleColor(backgroundColor, for: .highlighted)
        button.setBackgroundColor(color: .white, forState: .highlighted)

    

当我将按钮的背景颜色更改为黑色时,结果是一些深蓝色。就像屏幕背景颜色和按钮颜色混合在一起一样。

【问题讨论】:

您是否也使用setBackgroundColor 将其设置为黑色? 是的,然后当它突出显示时我会变成深蓝色 【参考方案1】:

为您的按钮创建一个自定义类并在状态下处理您的颜色更改属性,如下所示。

class MyButton: UIButton 
    fileprivate var titleColorNormal: UIColor = .white
    fileprivate var titleColorHighlighted: UIColor = .blue
    fileprivate var backgroundColorNormal: UIColor = .blue
    fileprivate var backgroundColorHighlighted: UIColor = .white
    override var isHighlighted: Bool 
        willSet(newValue)
            if newValue 
                self.setTitleColor(titleColorHighlighted, for: state)
                self.backgroundColor = backgroundColorHighlighted
            else 
                self.setTitleColor(titleColorNormal, for: state)
                self.backgroundColor = backgroundColorNormal
            
        
    

【讨论】:

这解决了问题。谢谢 :] 你只需要覆盖正常状态,它就会像魅力一样工作【参考方案2】:

要么为整个尺寸制作图像,要么使其可拉伸,以便填充整个背景:

extension UIButton 

    func setBackgroundColor(color: UIColor, for state: UIControlState) 

        let rect = CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 1, height: 1))
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()!

        context.setFillColor(color.cgColor)
        context.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        let insets = UIEdgeInsetsMake(0, 0, 0, 0)
        let stretchable = image!.resizableImage(withCapInsets: insets, resizingMode: .tile)
        self.setBackgroundImage(stretchable, for: state)
    


【讨论】:

这不起作用。我复制/粘贴它,结果是一样的 @Rango 显示代码库中的其余相关代码 我使用 view.backgroundColor = backgroundColor 作为屏幕背景颜色,这个方法 stylizingButton(:UIButton)viewDidLoad 调用 并作为参数传递一个按钮插座。扩展中只有这个功能 @Rango 很好,我使用了这段代码,它在我的代码库中完美运行.. 因此我只能假设你在故事板或其他代码中做了一些你没有做的事情分享,以这种副作用结束 感谢您的麻烦:]【参考方案3】:

我在突出显示状态下混合颜色时遇到了同样的问题,但不想创建自定义类。我发现您可以简单地将按钮类型从“系统”更改为“自定义”。然后您可以使用按状态设置颜色的功能。颜色将按照定义显示。

You can change the button type in interface builder.

【讨论】:

以上是关于在状态更改时更改按钮颜色的主要内容,如果未能解决你的问题,请参考以下文章

更改按钮文本和状态的颜色

根据 SwiftUI 中的状态(正常、突出显示、禁用)更改按钮颜色?

如何在 NativeScript 中为 iOS 更改突出显示状态的按钮文本颜色?

更改圆形按钮android的背景颜色

如何在颤动中更改特定的图标颜色?

SwiftUI - 按下按钮时如何更改所有其他按钮的颜色?