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?
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()
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!
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.
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)
}
}
}