swift - 禁用时自定义按钮不显示为灰色

标签 swift

我创建了一个自定义按钮,并且在未启用时将其设置为灰色。但是,当我运行该程序时,禁用的按钮不会变灰。我可能做错了什么。

自定义按钮类:

import UIKit

class CustomButton: UIButton {

    override init (frame: CGRect){
        super.init(frame: frame)
        config()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        config()
    }

    func config(){

        // Setting disabled/enabled traits
        setTitleColor(UIColor.gray, for: UIControl.State.disabled)
        setTitleColor(UIColor.gray, for: UIControl.State.normal)


        if !isEnabled{
            backgroundColor = UIColor.gray
        }else{
            backgroundColor = UIColor.white
        }

        // Other styling options
        layer.cornerRadius = 10

        // Making it look 3D
        layer.shadowColor = UIColor(red: 0.0, green: 0, blue: 0, alpha: 1.0).cgColor
        layer.shadowOpacity = 1.0
        layer.shadowRadius = 1.0
        layer.shadowOffset = CGSize(width: 0, height: 1)
    }

}

按钮初始化(也在 Storyboard中设置)

    @IBOutlet weak var movePickPosBut: CustomButton!

最佳答案

您根据isEnabled状态设置的背景颜色是静态的,而不是动态的;也就是说,在按钮构造时,您将检查它是否已启用(可能会启用)并相应地设置背景颜色。但是,当 isEnabled 标志更改时,这一点不会更改。

而是使用系统函数根据状态来控制后台。所以替换这段代码:-

if !isEnabled{
    backgroundColor = UIColor.gray
}else{
    backgroundColor = UIColor.white
}

有了这个:-

self.setBackgroundColor(UIColor.gray, for: .disabled)

这将使背景颜色与状态保持关联。

您还需要此代码,我从 this article 获取该代码(并可能提供进一步的帮助)。

extension UIButton {

  private func image(withColor color: UIColor) -> UIImage? {
    let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
    UIGraphicsBeginImageContext(rect.size)
    let context = UIGraphicsGetCurrentContext()

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

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return image
  }

  func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
    self.setBackgroundImage(image(withColor: color), for: state)
  }
}

关于swift - 禁用时自定义按钮不显示为灰色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56117667/

相关文章:

Swift Package Manager 可执行应用程序,设置部署目标

ios - 如果选中复选框,如何使用 UserDefaults 保留电子邮件和密码文本字段信息 Swift iOS

ios - 为什么在编码 URL 时格式化 NSPredicate 会导致 swift 崩溃?

swift - 可以在不使用 'Static' 的情况下创建单例类吗?

swift - 共享 PDF - Mail.app 中为空白,但通过 Airdrop 可以

swift - SpriteKit 中的 Admob Interstitials - Swift 3

swift - 点击按钮(位于 UICollectionViewController 中)时如何激活共享扩展(UIActivityViewController)?

ios - Swift 3 - slider 的指针宽度

swift - 如何沿水平线移动 SKSpriteNode

ios - 默认协议(protocol)实现导致 'does not conform to protocol' 错误