Прокси-серверы/UI_APPEARANCE_SELECTOR в Свифт?
В документации Apple указано:
Чтобы принять участие в API-интерфейсе внешнего вида, отметьте свой внешний вид селектора свойств в вашем заголовке с UI_APPEARANCE_SELECTOR.
В Objective-C можно аннотировать свойства с помощью UI_APPEARANCE_SELECTOR
следующим образом:
@property (nonatomic, strong) UIColor *foregroundColor UI_APPEARANCE_SELECTOR;
Как я могу сделать то же самое в Swift?
Ответы
Ответ 1
Пометьте свойство пользовательского представления как dynamic
.
Например:
class YourCustomView: UIView {
@objc dynamic var subviewColor: UIColor? {
get { return self.yourSubview.backgroundColor }
set { self.yourSubview.backgroundColor = newValue }
}
...
}
Тогда:
YourCustomView.appearance().subviewColor = UIColor.greenColor()
Ответ 2
Я не нашел решение, но обходное решение.
Вместо аннотирования свойств я сделал их как переменную класса.
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
В 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, и он работает, надеюсь, он вам тоже поможет.
Ответ 4
Основываясь на предыдущих ответах, вот расширение к 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)
}
}
}