Как вы можете предоставить поддержку макета во время разработки для пользовательского UIView? - PullRequest
0 голосов
/ 29 сентября 2018

Просто играю, чтобы увидеть, можно ли что-то сделать.Я знаю, что могу предоставить поддержку во время разработки для определенных свойств, добавив к ним @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 Preview

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

Appearance at DesignTime

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

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

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

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

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

...