Apple文档声明:
要参与外观代理API,请标记您的外观 带有UI_APPEARANCE_SELECTOR的标题中的属性选择器。
在Objective-C中,可以使用UI_APPEARANCE_SELECTOR
注释属性,如下所示:
@property (nonatomic, strong) UIColor *foregroundColor UI_APPEARANCE_SELECTOR;
如何在Swift中执行相同操作?
答案 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)
}
}
}