Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 12 additions & 23 deletions Sources/StackKit/HStackView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ open class HStackView: UIView, StackView {
self.distribution = distribution
self.padding = padding

for v in content() {
addSubview(v)
}
addContent(content)
}

public required init?(coder: NSCoder) {
Expand All @@ -35,15 +33,11 @@ open class HStackView: UIView, StackView {

public func resetContent(@_StackKitHStackContentResultBuilder _ content: () -> [UIView]) {
subviews.forEach { $0.removeFromSuperview() }
for v in content() {
addSubview(v)
}
addContent(content)
}

open override func didAddSubview(_ subview: UIView) {
super.didAddSubview(subview)

subview._tryFixSize()

// keep spacers between views and spacers have only one spacer
guard (subview as? SpacerView) != nil,
Expand Down Expand Up @@ -105,35 +99,24 @@ open class HStackView: UIView, StackView {

makeSubviewsAlignment()

fillDivider()
fillSpecifySpacer()
fillSpacer()

switch distribution {
case .spacing(let spacing):
fillDivider()
fillSpecifySpacer()
fillSpacer()

makeSpacing(spacing)

case .autoSpacing:
fillDivider()
fillSpecifySpacer()
fillSpacer()

let spacing = autoSpacing()
makeSpacing(spacing)

case .fillHeight(let spacing):
fillDivider()
fillSpecifySpacer()
fillSpacer()

let spacing = spacing ?? autoSpacing()
makeSpacing(spacing)
fillHeight()

case .fill:
fillDivider()
fillSpecifySpacer()
fillSpacer()
fillWidth()
makeSpacing(0)
fillHeight()
Expand Down Expand Up @@ -189,6 +172,12 @@ extension HStackView {
subview.frame.origin.x = previousView.frame.maxX + spacing
}
}

guard let offset = subview._stackKit_offset else {
continue
}
subview.frame.origin.x += offset.x
subview.frame.origin.y += offset.y
}
}

Expand Down
29 changes: 7 additions & 22 deletions Sources/StackKit/Layer/HStackLayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,7 @@ open class HStackLayer: CALayer, StackLayer {
self.distribution = distribution
self.padding = padding

for l in content() {
addSublayer(l)
}
addContent(content)
}

public func addContent(@_StackKitHStackLayerContentResultBuilder _ content: () -> [CALayer]) {
Expand All @@ -43,9 +41,7 @@ open class HStackLayer: CALayer, StackLayer {

public func resetContent(@_StackKitHStackLayerContentResultBuilder _ content: () -> [CALayer]) {
sublayers?.forEach { $0.removeFromSuperlayer() }
for v in content() {
addSublayer(v)
}
addContent(content)
}

public var contentSize: CGSize {
Expand Down Expand Up @@ -88,35 +84,24 @@ open class HStackLayer: CALayer, StackLayer {

makeSublayersAlignment()

fillDivider()
fillSpecifySpacer()
fillSpacer()

switch distribution {
case .spacing(let spacing):
fillDivider()
fillSpecifySpacer()
fillSpacer()

makeSpacing(spacing)

case .autoSpacing:
fillDivider()
fillSpecifySpacer()
fillSpacer()

let spacing = autoSpacing()
makeSpacing(spacing)

case .fillHeight(let spacing): // autoSpacing and fill height
fillDivider()
fillSpecifySpacer()
fillSpacer()

case .fillHeight(let spacing):
let spacing = spacing ?? autoSpacing()
makeSpacing(spacing)
fillHeight()

case .fill:
fillDivider()
fillSpecifySpacer()
fillSpacer()
fillWidth()
makeSpacing(0)
fillHeight()
Expand Down
4 changes: 1 addition & 3 deletions Sources/StackKit/Layer/HStackLayerWrapperView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ open class HStackLayerWrapperView: _StackLayerWrapperView {
hStackLayer.distribution = distribution
hStackLayer.padding = padding

for v in content() {
addSubview(v)
}
addContent(content)
}

public required init?(coder: NSCoder) {
Expand Down
27 changes: 6 additions & 21 deletions Sources/StackKit/Layer/VStackLayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,7 @@ open class VStackLayer: CALayer, StackLayer {
self.distribution = distribution
self.padding = padding

for l in content() {
addSublayer(l)
}
addContent(content)
}

public func addContent(@_StackKitVStackLayerContentResultBuilder _ content: () -> [CALayer]) {
Expand All @@ -43,9 +41,7 @@ open class VStackLayer: CALayer, StackLayer {

public func resetContent(@_StackKitVStackLayerContentResultBuilder _ content: () -> [CALayer]) {
sublayers?.forEach { $0.removeFromSuperlayer() }
for v in content() {
addSublayer(v)
}
addContent(content)
}

public var contentSize: CGSize {
Expand Down Expand Up @@ -89,35 +85,24 @@ open class VStackLayer: CALayer, StackLayer {

makeSublayersAlignment()

fillDivider()
fillSpecifySpacer()
fillSpacer()

switch distribution {
case .spacing(let spacing):
fillDivider()
fillSpecifySpacer()
fillSpacer()

makeSpacing(spacing)

case .autoSpacing:
fillDivider()
fillSpecifySpacer()
fillSpacer()

let spacing = autoSpacing()
makeSpacing(spacing)

case .fillWidth(let spacing):
fillDivider()
fillSpecifySpacer()
fillSpacer()

let spacing = spacing ?? autoSpacing()
makeSpacing(spacing)
fillWidth()

case .fill:
fillDivider()
fillSpecifySpacer()
fillSpacer()
fillHeight()
makeSpacing(0)
fillWidth()
Expand Down
4 changes: 1 addition & 3 deletions Sources/StackKit/Layer/VStackLayerWrapperView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ open class VStackLayerWrapperView: _StackLayerWrapperView {
vStackLayer.distribution = distribution
vStackLayer.padding = padding

for v in content() {
addSubview(v)
}
addContent(content)
}

public required init?(coder: NSCoder) {
Expand Down
5 changes: 0 additions & 5 deletions Sources/StackKit/UIView+StackKit/UIView+Effective.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,6 @@ extension UIView {
var _isEffectiveView: Bool {
!_isIneffectiveView
}

func _tryFixSize() {
guard frame.size == .zero else { return }
sizeToFit()
}
}

extension CALayer {
Expand Down
8 changes: 6 additions & 2 deletions Sources/StackKit/UIView+StackKit/UIView+FitSize.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@ var _StackKit_FitTypeKey = "_StackKit_FitTypeKey"
public enum FitType {
case content

/// **Adjust the view’s height** based on the reference width.
case width

/// **Adjust the view’s width** based on the reference height.
case height

/// Set fixed height, width auto calculate
case widthFlexible

/// Set fixed width, height auto calculate
case heightFlexible

Expand Down Expand Up @@ -80,8 +84,8 @@ extension UIView: FitSize {
}

case .content:
fitWidth = size.width ?? bounds.width
fitHeight = size.height ?? bounds.height
fitWidth = size.width ?? _stackKit_maxWidth ?? bounds.width
fitHeight = size.height ?? _stackKit_maxHeight ?? bounds.height
}

fitWidth = _validateValue(fitWidth)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ extension UIView: StackKitCompatibleProvider { }

extension StackKitCompatible where Base: UIView {

@discardableResult
public func offset(_ value: CGPoint?) -> Self {
view._stackKit_offset = value
return self
}

@discardableResult
public func width(_ value: CGFloat?) -> Self {
view._stackKit_width = value
Expand Down
20 changes: 20 additions & 0 deletions Sources/StackKit/UIView+StackKit/_UIView_StackKitProvider.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import UIKit

struct _UIView_StackKitKeys {
static var offsetKey = "StackKit_offsetKey"

static var widthKey = "StackKit_widthKey"
static var heightKey = "StackKit_heightKey"

Expand All @@ -12,6 +14,8 @@ struct _UIView_StackKitKeys {
}

protocol _UIView_StackKitProvider {
var _stackKit_offset: CGPoint? { get set }

var _stackKit_width: CGFloat? { get set }
var _stackKit_height: CGFloat? { get set }

Expand All @@ -24,6 +28,22 @@ protocol _UIView_StackKitProvider {

extension UIView: _UIView_StackKitProvider {

var _stackKit_offset: CGPoint? {
get {
guard let value = Runtime.getProperty(self, key: &_UIView_StackKitKeys.offsetKey) as? NSValue else {
return nil
}
return value.cgPointValue
}
set {
guard let newValue else {
Runtime.setProperty(self, key: &_UIView_StackKitKeys.offsetKey, value: nil, policy: .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return
}
Runtime.setProperty(self, key: &_UIView_StackKitKeys.offsetKey, value: NSValue(cgPoint: newValue), policy: .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}

var _stackKit_width: CGFloat? {
get {
Runtime.getCGFloatProperty(self, key: &_UIView_StackKitKeys.widthKey)
Expand Down
Loading