diff --git a/Classes/Extensions/View+Spacing.swift b/Classes/Extensions/View+Spacing.swift new file mode 100644 index 0000000..8c52199 --- /dev/null +++ b/Classes/Extensions/View+Spacing.swift @@ -0,0 +1,48 @@ +#if os(macOS) +import AppKit +#else +import UIKit +#endif + +private var spacingAssociationKey: UInt8 = 0 + +extension BaseView { + @available(iOS 11.0, *) + var spacing: State? { + get { + return objc_getAssociatedObject(self, &spacingAssociationKey) as? State + } + set(newValue) { + objc_setAssociatedObject(self, &spacingAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) + } + } + + @available(iOS 11.0, *) + @discardableResult + public func customSpacing(_ spacing: CGFloat) -> Self { + if self.spacing == nil { + self.spacing = State.init(wrappedValue: spacing) + } + else { + self.spacing?.wrappedValue = spacing + } + + if let superView = self.superview as? _STV { + superView.setCustomSpacing(spacing, after: self) + } + return self + } + + @available(iOS 11.0, *) + @discardableResult + public func customSpacing(_ spacing: State) -> Self { + self.spacing = spacing + spacing.listen { [weak self] new in + guard let self = self else { return } + if let superView = self.superview as? _STV { + superView.setCustomSpacing(new, after: self) + } + } + return self + } +} \ No newline at end of file diff --git a/Classes/Views/Universal/StackView.swift b/Classes/Views/Universal/StackView.swift index 99c65b7..b3d4a55 100644 --- a/Classes/Views/Universal/StackView.swift +++ b/Classes/Views/Universal/StackView.swift @@ -182,7 +182,16 @@ open class _StackView: _STV, AnyDeclarativeProtocol, DeclarativeProtocolInternal self.spacing = state.wrappedValue return self } - + + open override func addArrangedSubview(_ view: UIView) { + super.addArrangedSubview(view) + if #available(iOS 11.0, *) { + if let spacing = view.spacing { + self.setCustomSpacing(spacing.wrappedValue, after: view) + } + } + } + func add(item: BodyBuilderItemable) { switch item.bodyBuilderItem { case .single(let view):