Appleドキュメントはこう述べています:
外観プロキシAPIに参加するには、UI_APPEARANCE_SELECTORを使用して、ヘッダーの外観プロパティセレクターにタグを付けます。
Objective-Cでは、次のようにUI_APPEARANCE_SELECTOR
でプロパティに注釈を付けることができます。
@property (nonatomic, strong) UIColor *foregroundColor UI_APPEARANCE_SELECTOR;
Swiftで同じようにするにはどうすればよいですか?
カスタムビュープロパティをdynamic
としてマークします。
例えば:
class YourCustomView: UIView {
@objc dynamic var subviewColor: UIColor? {
get { return self.yourSubview.backgroundColor }
set { self.yourSubview.backgroundColor = newValue }
}
...
}
次に:
YourCustomView.appearance().subviewColor = UIColor.greenColor()
解決策は見つかりませんでしたが、回避策はありました。プロパティに注釈を付ける代わりに、クラス変数として作成しました。
private struct StarFillColor { static var _color = UIColor.blackColor() }
internal class var starFillColor: UIColor {
get { return StarFillColor._color }
set { StarFillColor._color = newValue }
}
そして、私がすべての外見をセットアップしたファイルで:
MyClass.starFillColor = UIColor.r(181, g: 60, b: 109)
私はそれが誰かを助けることを願っています!
Swiftでは、UI_APPEARANCE_SELECTOR
でプロパティに注釈を付ける必要はありません(実際にはできません)。
外観プロパティアクセサーメソッドが次の形式であることを確認してください。
func propertyForAxis1(axis1: IntegerType, axis2: IntegerType, axisN: IntegerType) -> PropertyType
func setProperty(property: PropertyType, forAxis1 axis1: IntegerType, axis2: IntegerType)
例えば:
func setStarViewColor(color: UIColor) {
self.backgroundColor = color
}
次に、次のように外観プロパティを設定できます。
MyView.appearance().setStarViewColor(someColor)
私は現在Swiftプロジェクトでこのソリューションを使用しており、それが機能します。それがあなたにも役立つことを願っています。
以前の回答に基づいて、ビューの境界でUIViewの外観を管理するために実装したUIViewの拡張機能を以下に示します。
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)
}
}
}