IBDesignable и обновление внутренних ограничений на автоматическое расположение с помощью свойства IBInspectable - PullRequest
0 голосов
/ 16 октября 2018

У меня есть 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 вообще не обновляется.Поэтому у меня есть такие вопросы:

  1. Как сделать так, чтобы изменение leftMargin обновило Макет моего пользовательского представления?
  2. Как выставить для Интерфейсного Разработчика внутреннее contentView, чтобы яможет поместить содержимое в это представление в Интерфейсном Разработчике.В настоящее время я вижу только внешний UIView.Я имею в виду что-то подобное с Visual Effect View имеет внутренний View.Я хотел бы иметь доступ к своему внутреннему red contentView, чтобы я мог заполнять объектами в Интерфейсном Разработчике.

enter image description here

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