I am trying to implement a simple subclass of UIButton, which is IBDesignable. I need the ability to set a color for each control state from Interface Builder. I know this is possible with the IBInspectable keyword. I am having problems with IB failure when using state owned KVOs. The IBDesignable debugger crashes. Does anyone know how I can work with KVO and IBDesignable together?
@IBDesignable class UIButtonActionButton: UIButton { @IBInspectable var defaultColour: UIColor = UIColor.blueColor() { didSet { self.setNeedsDisplay() } } @IBInspectable var selectedColour: UIColor = UIColor.blueColor() @IBInspectable var disabledColour: UIColor = UIColor.grayColor() required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self._setup() } override init(frame: CGRect) { super.init(frame: frame) self._setup() } private func _setup(){ self.addObserver(self, forKeyPath: "state", options: NSKeyValueObservingOptions.New, context: nil) self.layer.cornerRadius = 5.0 self.layer.masksToBounds = true } override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { self.setNeedsDisplay() } override func drawRect(rect: CGRect) { super.drawRect(rect) let context = UIGraphicsGetCurrentContext() if self.highlighted { CGContextSetFillColorWithColor(context, selectedColour.CGColor) CGContextFillRect(context, self.bounds) } else if self.state == UIControlState.Disabled { CGContextSetFillColorWithColor(context, disabledColour.CGColor) CGContextFillRect(context, self.bounds) } else { CGContextSetFillColorWithColor(context, defaultColour.CGColor) CGContextFillRect(context, self.bounds) } } deinit { self.removeObserver(self, forKeyPath: "state", context: nil) } }
source share