|
import UIKit |
|
|
|
// https://spin.atomicobject.com/2018/04/25/uibutton-background-color/ |
|
|
|
// Declare a global var to produce a unique address as the assoc object handle |
|
private var normalColorHandle: UInt8 = 0 |
|
private var disabledColorHandle: UInt8 = 0 |
|
private var highlightedColorHandle: UInt8 = 0 |
|
private var selectedColorHandle: UInt8 = 0 |
|
|
|
@IBDesignable |
|
extension UIButton { |
|
// https://stackoverflow.com/questions/14523348/how-to-change-the-background-color-of-a-uibutton-while-its-highlighted |
|
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: UIControl.State) { |
|
self.setBackgroundImage(image(withColor: color), for: state) |
|
} |
|
|
|
@IBInspectable |
|
var normalColor: UIColor? { |
|
get { |
|
if let color = objc_getAssociatedObject(self, &normalColorHandle) as? UIColor { |
|
return color |
|
} |
|
return nil |
|
} |
|
set { |
|
if let color = newValue { |
|
self.setBackgroundColor(color, for: .normal) |
|
objc_setAssociatedObject(self, &normalColorHandle, color, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) |
|
} else { |
|
self.setBackgroundImage(nil, for: .normal) |
|
objc_setAssociatedObject(self, &normalColorHandle, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) |
|
} |
|
} |
|
} |
|
|
|
@IBInspectable |
|
var disabledColor: UIColor? { |
|
get { |
|
if let color = objc_getAssociatedObject(self, &disabledColorHandle) as? UIColor { |
|
return color |
|
} |
|
return nil |
|
} |
|
set { |
|
if let color = newValue { |
|
self.setBackgroundColor(color, for: .disabled) |
|
objc_setAssociatedObject(self, &disabledColorHandle, color, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) |
|
} else { |
|
self.setBackgroundImage(nil, for: .disabled) |
|
objc_setAssociatedObject(self, &disabledColorHandle, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) |
|
} |
|
} |
|
} |
|
|
|
@IBInspectable |
|
var highlightedColor: UIColor? { |
|
get { |
|
if let color = objc_getAssociatedObject(self, &highlightedColorHandle) as? UIColor { |
|
return color |
|
} |
|
return nil |
|
} |
|
set { |
|
if let color = newValue { |
|
self.setBackgroundColor(color, for: .highlighted) |
|
objc_setAssociatedObject(self, &highlightedColorHandle, color, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) |
|
} else { |
|
self.setBackgroundImage(nil, for: .highlighted) |
|
objc_setAssociatedObject(self, &highlightedColorHandle, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) |
|
} |
|
} |
|
} |
|
|
|
@IBInspectable |
|
var selectedColor: UIColor? { |
|
get { |
|
if let color = objc_getAssociatedObject(self, &selectedColorHandle) as? UIColor { |
|
return color |
|
} |
|
return nil |
|
} |
|
set { |
|
if let color = newValue { |
|
self.setBackgroundColor(color, for: .selected) |
|
objc_setAssociatedObject(self, &selectedColorHandle, color, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) |
|
} else { |
|
self.setBackgroundImage(nil, for: .selected) |
|
objc_setAssociatedObject(self, &selectedColorHandle, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) |
|
} |
|
} |
|
} |
|
} |