Вы спросили:
Может кто-нибудь предложить метод для преодоления этого кратера 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:
Другой подход состоит в том, чтобы не использовать именованные цвета в каталоге активов, а определить собственное расширение UIColor
:
extension UIColor {
static let buttonBackground = #colorLiteral(red: 0, green: 1, blue: 1, alpha: 1)
}
Затем, когда вы хотите установить какое-либо свойство цвета, вы можете сделать что-то вроде:
backgroundColor = .buttonBackground
Недостатком этого подхода является то, что вы теряете возможность использовать названный цвет в IB для других элементов управления , Но это еще одна модель для рассмотрения.