Swift中的外观代理/ UI_APPEARANCE_SELECTOR?

时间:2014-10-02 22:17:38

标签: swift uikit uiappearance

Apple文档声明:

  

要参与外观代理API,请标记您的外观   带有UI_APPEARANCE_SELECTOR的标题中的属性选择器。

在Objective-C中,可以使用UI_APPEARANCE_SELECTOR注释属性,如下所示:

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

如何在Swift中执行相同操作?

4 个答案:

答案 0 :(得分:46)

将自定义视图属性标记为dynamic

例如:

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

然后:

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

答案 1 :(得分:3)

我没有找到解决方案,而是一种解决方法。 我没有注释属性,而是将它们作为类变量。

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) 

我希望它会对某人有所帮助!

答案 2 :(得分:1)

在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项目中使用此解决方案并且它有效,希望它对您也有帮助。

答案 3 :(得分:1)

根据先前的回答,这是UIView的扩展,我实现了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)
        }
    }
}