web-dev-qa-db-ja.com

外観プロキシ/ SwiftのUI_APPEARANCE_SELECTOR?

Appleドキュメントはこう述べています:

外観プロキシAPIに参加するには、UI_APPEARANCE_SELECTORを使用して、ヘッダーの外観プロパティセレクターにタグを付けます。

Objective-Cでは、次のようにUI_APPEARANCE_SELECTORでプロパティに注釈を付けることができます。

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

Swiftで同じようにするにはどうすればよいですか?

48
Klaas

カスタムビュープロパティをdynamicとしてマークします。

例えば:

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

次に:

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

解決策は見つかりませんでしたが、回避策はありました。プロパティに注釈を付ける代わりに、クラス変数として作成しました。

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) 

私はそれが誰かを助けることを願っています!

3
Kevin Delord

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プロジェクトでこのソリューションを使用しており、それが機能します。それがあなたにも役立つことを願っています。

1
guojiubo

以前の回答に基づいて、ビューの境界で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)
        }
    }
}
1
Climbatize