Подтвердить что ты не робот

Прокси-серверы/UI_APPEARANCE_SELECTOR в Свифт?

В документации Apple указано:

Чтобы принять участие в API-интерфейсе внешнего вида, отметьте свой внешний вид селектора свойств в вашем заголовке с UI_APPEARANCE_SELECTOR.

В Objective-C можно аннотировать свойства с помощью UI_APPEARANCE_SELECTOR следующим образом:

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

Как я могу сделать то же самое в Swift?

4b9b3361

Ответ 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)
        }
    }
}