苹果文档说明:
要参与外观代理 API,请在标头中标记具有 UI_APPEARANCE_SELECTOR 的外观属性选择器。
在 Objective-C 中,可以像这样使用 UI_APPEARANCE_SELECTOR
注释属性:
@property (nonatomic, strong) UIColor *foregroundColor UI_APPEARANCE_SELECTOR;
我该如何在Swift中实现同样的功能?
苹果文档说明:
要参与外观代理 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)
我希望它能够帮助到某些人!
UI_APPEARANCE_SELECTOR
注释属性。
func propertyForAxis1(axis1: IntegerType, axis2: IntegerType, axisN: IntegerType) -> PropertyType func setProperty(property: PropertyType, forAxis1 axis1: IntegerType, axis2: IntegerType)
Source: Apple Documentation
例如:
func setStarViewColor(color: UIColor) {
self.backgroundColor = color
}
MyView.appearance().setStarViewColor(someColor)
我目前在我的Swift项目中使用这个解决方案,它有效,希望对您也有所帮助。
UIButton
的子类,并且我遵循文档中所说的UIAppearanceContainer
协议!谢谢! - Rich根据之前的回答,这是我实现的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)
}
}
}
@objc
属性才能使其正常工作。 - maxkonovalov