IB Designables: не удалось отобразить и обновить состояние автоматической разметки ... Сбой агента - PullRequest
0 голосов
/ 18 марта 2020

Агент построителя интерфейса падает, когда у меня есть следующий код в классе IBDesignable.

    self.backgroundColor = UIColor.mooButtonBackgroundColor

Представление цвета принимает вид:

@nonobjc class var mooButtonBackgroundColor : UIColor {
    UIColor(named: "Color.Button.Background")!   // 0.129, 0.490, 0.851, 1
}

Однако, если Я изменяю возвращаемое значение на:

@nonobjc class var mooButtonBackgroundColor : UIColor {
    .green //UIColor(named: "Color.Button.Background")!   // 0.129, 0.490, 0.851, 1
}

все это работает.

Я также пробовал метод без тега @ nonobj c, с тем же результатом.

Есть ли в IBDesigner ограничение, запрещающее использование именованных цветов?

Может кто-нибудь предложить метод для преодоления этого краба sh в IBDesigner?

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Хорошо, получается, что это ошибка. Исправлено в Xcode 11.4:

Исправлена ​​ошибка, когда при использовании именованных цветов в свойствах IBInspectable во время выполнения использовался фиксированный цвет вместо цвета Dynami c из каталога ресурсов. (55248109) (FB7248211)

1 голос
/ 18 марта 2020

Вы спросили:

Может кто-нибудь предложить метод для преодоления этого кратера sh в IBDesigner?

Мы не можем решить проблему названного цвета, но мы, безусловно, можем устранить cra sh, избегая оператора принудительной распаковки !. Например, вместо этого вы можете использовать оператор nil коалесцирования, ??, поэтому у вас есть некоторый запасной цвет для IB, например

backgroundColor = UIColor(named: "Color.Button.Background") ?? .blue

Но если вы не принудительно развернете его, не взломаю sh. И хотя он не будет использовать ваш названный цвет в IB, он будет использоваться при запуске приложения.


Лично я бы не стал устанавливать какие-либо свойства, обычно устанавливаемые в IB (например, backgroundColor). в дизайнерском виде, сама. Я думаю, что очень сложно смотреть на какое-то представление в IB, изменять свойство, такое как цвет фона, и неправильно отображать его.

То, что можно настроить в IB, вероятно, следует оставить в IB, чтобы Избегайте путаницы.


Но давайте рассмотрим пример, в котором я хотел, чтобы пользовательское свойство цвета использовало именованный цвет. Я бы объявил свойство цвета @IBInspectable, например, рассмотрел бы этот круговой вид с пользовательским fillColor:

@IBDesignable
class CircleView: UIView {
    let shapeLayer = CAShapeLayer()

    @IBInspectable var fillColor: UIColor = .blue { didSet { shapeLayer.fillColor = fillColor.cgColor } }

    override init(frame: CGRect = .zero) {
        super.init(frame: frame)
        configure()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        configure()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        updatePaths()
    }
}

private extension CircleView {
    func configure() {
        layer.addSublayer(shapeLayer)
        shapeLayer.fillColor = fillColor.cgColor
    }

    func updatePaths() {
        let center = CGPoint(x: bounds.midX, y: bounds.midY)
        let radius = min(bounds.width, bounds.height) / 2
        shapeLayer.path = UIBezierPath(arcCenter: center, radius: radius, startAngle: 0, endAngle: 2 * .pi, clockwise: true).cgPath
    }
}

Затем я бы установил именованный цвет в инспекторе атрибутов IB:

enter image description here


Другой подход состоит в том, чтобы не использовать именованные цвета в каталоге активов, а определить собственное расширение UIColor:

extension UIColor {
    static let buttonBackground = #colorLiteral(red: 0, green: 1, blue: 1, alpha: 1)
}

Затем, когда вы хотите установить какое-либо свойство цвета, вы можете сделать что-то вроде:

backgroundColor = .buttonBackground

Недостатком этого подхода является то, что вы теряете возможность использовать названный цвет в IB для других элементов управления , Но это еще одна модель для рассмотрения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...