Как вы можете предоставить поддержку макета во время разработки для пользовательского 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 соответственно, вы получите это, как и ожидалось...
Опять же, во время выполнения, это работает как ожидалось. Что меня интересует, так это то, как я могу заставить эту работу работать во время разработки (если вообще), потому что это выглядит так в настоящее время...
Примечание. Позиции на экране не соответствуют порядковым номерам самих представлений (т. Е. Синий находится посередине во время выполнения, но нижний - во время разработки, поскольку время разработки не соответствует требованиям (или вообще не выполняется!) заказ / выкладка.
Я знаю, что нормальный StackView поддерживает это, но мне интересно, если это из-за следующего:
- Будучи разработанным Apple, для Xcode/IB существуют определенные уступки или...
- То, что он находится в отдельной библиотеке (я считаю, динамической) и таким образом компилируется отдельно, что позволяет ему работать по-другому.
Оба из вышеупомянутых предположений, но я был бы более склонен думать, что это # 1.
Так может ли быть реализована поддержка макета во время разработки? Если так, то как?