У меня есть IBDesignable UIView с одним свойством @IBInspectable leftMargin
.Это представление содержит одно подпредставление contentView
.Кадр contentView
контролируется Autolayout.Управляя свойством leftMargin
в Интерфейсном Разработчике, я хотел бы видеть, как изменились мои внутренние ограничения Autolayout (между self
view и contentView
).У меня есть такой простой код, но я не могу понять, как я могу это сделать.Я извлек свой вариант использования из очень сложного примера только для этого вопроса.Вот код:
import UIKit
@IBDesignable class LayoutConstraintsDemoView: UIView {
@IBInspectable var leftMargin: CGFloat = 16.0 {
didSet {
self.updateMargins()
}
}
lazy var contentView: UIView = self.lazyContentView()
var leadingConstraint: NSLayoutConstraint? = nil
convenience init() {
self.init(frame: CGRect.zero)
}
override init(frame: CGRect) {
super.init(frame: frame)
self.selfInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.selfInit()
}
override func prepareForInterfaceBuilder() {
self.leftMargin = 8.0
}
private func selfInit() {
backgroundColor = .yellow
addSubview(contentView)
NSLayoutConstraint.activate([
contentView.topAnchor.constraint(equalTo: topAnchor),
contentView.trailingAnchor.constraint(equalTo: trailingAnchor),
contentView.bottomAnchor.constraint(equalTo: bottomAnchor),
])
self.leadingConstraint = contentView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: self.leftMargin)
self.leadingConstraint?.isActive = true
}
fileprivate func lazyContentView() -> UIView {
let view = UIView(frame: CGRect.zero)
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .red
return view
}
func updateMargins() {
self.leadingConstraint?.constant = self.leftMargin
setNeedsLayout()
layoutIfNeeded()
}
}
В конструкторе интерфейсов я могу изменить leftMargin
, но мой вид AutoLayout вообще не обновляется.Поэтому у меня есть такие вопросы:
- Как сделать так, чтобы изменение
leftMargin
обновило Макет моего пользовательского представления? - Как выставить для Интерфейсного Разработчика внутреннее
contentView
, чтобы яможет поместить содержимое в это представление в Интерфейсном Разработчике.В настоящее время я вижу только внешний UIView.Я имею в виду что-то подобное с Visual Effect View
имеет внутренний View
.Я хотел бы иметь доступ к своему внутреннему red
contentView
, чтобы я мог заполнять объектами в Интерфейсном Разработчике.