Appearance proxies / UI_APPEARANCE_SELECTOR in Swift? Appearance proxies / UI_APPEARANCE_SELECTOR in Swift? swift swift

Appearance proxies / UI_APPEARANCE_SELECTOR in Swift?


Mark your custom view property as dynamic.

For example:

class YourCustomView: UIView {    @objc dynamic var subviewColor: UIColor? {        get { return self.yourSubview.backgroundColor }        set { self.yourSubview.backgroundColor = newValue }    }    ...}

Then:

YourCustomView.appearance().subviewColor = UIColor.greenColor()


I did not find the solution but a workaround.Instead of annotating the properties I made them as a class variable.

private struct StarFillColor { static var _color = UIColor.blackColor() }internal class var starFillColor: UIColor {    get { return StarFillColor._color }    set { StarFillColor._color = newValue }}

And in the file where I setup all my appearances:

MyClass.starFillColor = UIColor.r(181, g: 60, b: 109) 

I hope it will help somebody!


Based on previous answers, here is the extension to UIView I implemented to manage UIView appearance with view borders, I hope it can help someone :

extension UIView {    @objc dynamic  var borderColor: UIColor? {        get {            if let color = self.layer.borderColor {                return UIColor(cgColor: color)            } else {                return nil            }        }        set(color) {            self.layer.borderColor = color?.cgColor        }    }    @objc dynamic  var borderWidth: NSNumber? {        get { return NSNumber(value: Float(self.layer.borderWidth))}        set(width) {            self.layer.borderWidth = CGFloat(width?.floatValue ?? 0)        }    }    @objc dynamic  var cornerRadius: NSNumber? {        get { return NSNumber(value: Float(self.layer.cornerRadius))}        set(radius) {            self.layer.cornerRadius = CGFloat(radius?.floatValue ?? 0)        }    }}