web-dev-qa-db-fra.com

Proxy d'apparence / UI_APPEARANCE_SELECTOR dans Swift?

La documentation Apple indique:

Pour participer à l'API du proxy d'apparence, balisez vos sélecteurs de propriétés d'apparence dans votre en-tête avec UI_APPEARANCE_SELECTOR.

Dans Objective-C, on peut annoter des propriétés avec UI_APPEARANCE_SELECTOR comme ça:

@property (nonatomic, strong) UIColor *foregroundColor UI_APPEARANCE_SELECTOR;

Comment puis-je faire de même dans Swift?

48
Klaas

Marquez votre propriété de vue personnalisée comme dynamic.

Par exemple:

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

Ensuite:

YourCustomView.appearance().subviewColor = UIColor.greenColor()
48
Yoichi Tagaya

Je n'ai pas trouvé la solution mais une solution de contournement. Au lieu d'annoter les propriétés, je les ai faites en tant que variable de classe.

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

Et dans le dossier où j'ai configuré toutes mes apparitions:

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

J'espère que ça va aider quelqu'un!

3
Kevin Delord

Dans Swift, vous n'avez pas besoin (en fait, vous ne pouvez pas) d'annoter des propriétés avec UI_APPEARANCE_SELECTOR.

Assurez-vous simplement que vos méthodes d'accesseur de propriété d'apparence sont de la forme:

func propertyForAxis1(axis1: IntegerType, axis2: IntegerType, axisN: IntegerType) -> PropertyType
func setProperty(property: PropertyType, forAxis1 axis1: IntegerType, axis2: IntegerType)

Par exemple:

func setStarViewColor(color: UIColor) {
    self.backgroundColor = color
}

Ensuite, vous pouvez définir votre propriété d'apparence comme ceci:

MyView.appearance().setStarViewColor(someColor)

J'utilise actuellement cette solution dans mon projet Swift et cela fonctionne, j'espère que cela vous sera également utile.

1
guojiubo

Sur la base des réponses précédentes, voici l'extension d'UIView que j'ai implémentée pour gérer l'apparence d'UIView avec les bordures de vue, j'espère que cela peut aider quelqu'un:

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)
        }
    }
}
1
Climbatize