Как вы можете предоставить поддержку макета во время разработки для пользовательского UIView?

Просто играть, чтобы посмотреть, можно ли что-то сделать. Я знаю, что могу оказать поддержку во время разработки некоторых свойств, добавив @IBInspectable для них, и я также знаю о том, чтобы заставить само представление поддерживать рендеринг и отображение во время разработки, помечая весь вид @IBDesignable, Это все работает. То, что я не могу заставить работать - это поддержка пользовательских макетов.

Рассмотрим этот иллюстративный подкласс UIView...

@IBDesignable
public class SimpleStackView : UIView {

    public var spacing:CGFloat = 10 {
        didSet{
            setNeedsLayout()
        }
    }

    @IBInspectable
    public var insets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) {
        didSet{
            setNeedsLayout()
        }
    }

    public override func layoutSubviews() {

        var offset:CGFloat = insets.top

        let visibleSubviews = subviews.filter({ $0.isVisible })
        for view in visibleSubviews{

            let desiredSize = view.intrinsicContentSize

            view.frame = CGRect(
                x      : insets.left,
                y      : offset,
                width  : bounds.width - insets.left - insets.right,
                height : desiredSize.height)

            offset += desiredSize.height + spacing
        }
    }
}

Примечание: это не полнофункциональный - он не вычисляет собственную внутреннюю высоту в качестве примера - но он показывает основы

Добавление выше SimpleStackView к основному виду ViewController, прикрепив все четыре ребра к контейнеру с интервалом 20, а также добавив три подпредставления с внутренней высотой 40, 120 и 80 соответственно, вы получите это, как и ожидалось...

SimpleStackView Предварительный просмотр

Опять же, во время выполнения, это работает как ожидалось. Что меня интересует, так это то, как я могу заставить эту работу работать во время разработки (если вообще), потому что это выглядит так в настоящее время...

Внешний вид на DesignTime

Примечание. Позиции на экране не соответствуют порядковым номерам самих представлений (т. Е. Синий находится посередине во время выполнения, но нижний - во время разработки, поскольку время разработки не соответствует требованиям (или вообще не выполняется!) заказ / выкладка.

Я знаю, что нормальный StackView поддерживает это, но мне интересно, если это из-за следующего:

  1. Будучи разработанным Apple, для Xcode/IB существуют определенные уступки или...
  2. То, что он находится в отдельной библиотеке (я считаю, динамической) и таким образом компилируется отдельно, что позволяет ему работать по-другому.

Оба из вышеупомянутых предположений, но я был бы более склонен думать, что это # ​​1.

Так может ли быть реализована поддержка макета во время разработки? Если так, то как?

0 ответов

Другие вопросы по тегам