Skip to content

Commit 50a56cc

Browse files
authored
Merge pull request #27 from iWECon/dev
.offset support
2 parents f6d9bbc + d0f888a commit 50a56cc

11 files changed

Lines changed: 71 additions & 115 deletions

Sources/StackKit/HStackView.swift

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ open class HStackView: UIView, StackView {
1818
self.distribution = distribution
1919
self.padding = padding
2020

21-
for v in content() {
22-
addSubview(v)
23-
}
21+
addContent(content)
2422
}
2523

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

3634
public func resetContent(@_StackKitHStackContentResultBuilder _ content: () -> [UIView]) {
3735
subviews.forEach { $0.removeFromSuperview() }
38-
for v in content() {
39-
addSubview(v)
40-
}
36+
addContent(content)
4137
}
4238

4339
open override func didAddSubview(_ subview: UIView) {
4440
super.didAddSubview(subview)
45-
46-
subview._tryFixSize()
4741

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

106100
makeSubviewsAlignment()
107101

102+
fillDivider()
103+
fillSpecifySpacer()
104+
fillSpacer()
105+
108106
switch distribution {
109107
case .spacing(let spacing):
110-
fillDivider()
111-
fillSpecifySpacer()
112-
fillSpacer()
113-
114108
makeSpacing(spacing)
115109

116110
case .autoSpacing:
117-
fillDivider()
118-
fillSpecifySpacer()
119-
fillSpacer()
120-
121111
let spacing = autoSpacing()
122112
makeSpacing(spacing)
123113

124114
case .fillHeight(let spacing):
125-
fillDivider()
126-
fillSpecifySpacer()
127-
fillSpacer()
128-
129115
let spacing = spacing ?? autoSpacing()
130116
makeSpacing(spacing)
131117
fillHeight()
132118

133119
case .fill:
134-
fillDivider()
135-
fillSpecifySpacer()
136-
fillSpacer()
137120
fillWidth()
138121
makeSpacing(0)
139122
fillHeight()
@@ -189,6 +172,12 @@ extension HStackView {
189172
subview.frame.origin.x = previousView.frame.maxX + spacing
190173
}
191174
}
175+
176+
guard let offset = subview._stackKit_offset else {
177+
continue
178+
}
179+
subview.frame.origin.x += offset.x
180+
subview.frame.origin.y += offset.y
192181
}
193182
}
194183

Sources/StackKit/Layer/HStackLayer.swift

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ open class HStackLayer: CALayer, StackLayer {
3030
self.distribution = distribution
3131
self.padding = padding
3232

33-
for l in content() {
34-
addSublayer(l)
35-
}
33+
addContent(content)
3634
}
3735

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

4442
public func resetContent(@_StackKitHStackLayerContentResultBuilder _ content: () -> [CALayer]) {
4543
sublayers?.forEach { $0.removeFromSuperlayer() }
46-
for v in content() {
47-
addSublayer(v)
48-
}
44+
addContent(content)
4945
}
5046

5147
public var contentSize: CGSize {
@@ -88,35 +84,24 @@ open class HStackLayer: CALayer, StackLayer {
8884

8985
makeSublayersAlignment()
9086

87+
fillDivider()
88+
fillSpecifySpacer()
89+
fillSpacer()
90+
9191
switch distribution {
9292
case .spacing(let spacing):
93-
fillDivider()
94-
fillSpecifySpacer()
95-
fillSpacer()
96-
9793
makeSpacing(spacing)
9894

9995
case .autoSpacing:
100-
fillDivider()
101-
fillSpecifySpacer()
102-
fillSpacer()
103-
10496
let spacing = autoSpacing()
10597
makeSpacing(spacing)
10698

107-
case .fillHeight(let spacing): // autoSpacing and fill height
108-
fillDivider()
109-
fillSpecifySpacer()
110-
fillSpacer()
111-
99+
case .fillHeight(let spacing):
112100
let spacing = spacing ?? autoSpacing()
113101
makeSpacing(spacing)
114102
fillHeight()
115103

116104
case .fill:
117-
fillDivider()
118-
fillSpecifySpacer()
119-
fillSpacer()
120105
fillWidth()
121106
makeSpacing(0)
122107
fillHeight()

Sources/StackKit/Layer/HStackLayerWrapperView.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ open class HStackLayerWrapperView: _StackLayerWrapperView {
2828
hStackLayer.distribution = distribution
2929
hStackLayer.padding = padding
3030

31-
for v in content() {
32-
addSubview(v)
33-
}
31+
addContent(content)
3432
}
3533

3634
public required init?(coder: NSCoder) {

Sources/StackKit/Layer/VStackLayer.swift

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ open class VStackLayer: CALayer, StackLayer {
3030
self.distribution = distribution
3131
self.padding = padding
3232

33-
for l in content() {
34-
addSublayer(l)
35-
}
33+
addContent(content)
3634
}
3735

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

4442
public func resetContent(@_StackKitVStackLayerContentResultBuilder _ content: () -> [CALayer]) {
4543
sublayers?.forEach { $0.removeFromSuperlayer() }
46-
for v in content() {
47-
addSublayer(v)
48-
}
44+
addContent(content)
4945
}
5046

5147
public var contentSize: CGSize {
@@ -89,35 +85,24 @@ open class VStackLayer: CALayer, StackLayer {
8985

9086
makeSublayersAlignment()
9187

88+
fillDivider()
89+
fillSpecifySpacer()
90+
fillSpacer()
91+
9292
switch distribution {
9393
case .spacing(let spacing):
94-
fillDivider()
95-
fillSpecifySpacer()
96-
fillSpacer()
97-
9894
makeSpacing(spacing)
9995

10096
case .autoSpacing:
101-
fillDivider()
102-
fillSpecifySpacer()
103-
fillSpacer()
104-
10597
let spacing = autoSpacing()
10698
makeSpacing(spacing)
10799

108100
case .fillWidth(let spacing):
109-
fillDivider()
110-
fillSpecifySpacer()
111-
fillSpacer()
112-
113101
let spacing = spacing ?? autoSpacing()
114102
makeSpacing(spacing)
115103
fillWidth()
116104

117105
case .fill:
118-
fillDivider()
119-
fillSpecifySpacer()
120-
fillSpacer()
121106
fillHeight()
122107
makeSpacing(0)
123108
fillWidth()

Sources/StackKit/Layer/VStackLayerWrapperView.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ open class VStackLayerWrapperView: _StackLayerWrapperView {
2828
vStackLayer.distribution = distribution
2929
vStackLayer.padding = padding
3030

31-
for v in content() {
32-
addSubview(v)
33-
}
31+
addContent(content)
3432
}
3533

3634
public required init?(coder: NSCoder) {

Sources/StackKit/UIView+StackKit/UIView+Effective.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@ extension UIView {
99
var _isEffectiveView: Bool {
1010
!_isIneffectiveView
1111
}
12-
13-
func _tryFixSize() {
14-
guard frame.size == .zero else { return }
15-
sizeToFit()
16-
}
1712
}
1813

1914
extension CALayer {

Sources/StackKit/UIView+StackKit/UIView+FitSize.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@ var _StackKit_FitTypeKey = "_StackKit_FitTypeKey"
55
public enum FitType {
66
case content
77

8+
/// **Adjust the view’s height** based on the reference width.
89
case width
10+
11+
/// **Adjust the view’s width** based on the reference height.
912
case height
1013

1114
/// Set fixed height, width auto calculate
1215
case widthFlexible
16+
1317
/// Set fixed width, height auto calculate
1418
case heightFlexible
1519

@@ -80,8 +84,8 @@ extension UIView: FitSize {
8084
}
8185

8286
case .content:
83-
fitWidth = size.width ?? bounds.width
84-
fitHeight = size.height ?? bounds.height
87+
fitWidth = size.width ?? _stackKit_maxWidth ?? bounds.width
88+
fitHeight = size.height ?? _stackKit_maxHeight ?? bounds.height
8589
}
8690

8791
fitWidth = _validateValue(fitWidth)

Sources/StackKit/UIView+StackKit/UIView+StackKitCompatibleProvider.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ extension UIView: StackKitCompatibleProvider { }
1313

1414
extension StackKitCompatible where Base: UIView {
1515

16+
@discardableResult
17+
public func offset(_ value: CGPoint?) -> Self {
18+
view._stackKit_offset = value
19+
return self
20+
}
21+
1622
@discardableResult
1723
public func width(_ value: CGFloat?) -> Self {
1824
view._stackKit_width = value

Sources/StackKit/UIView+StackKit/_UIView_StackKitProvider.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import UIKit
22

33
struct _UIView_StackKitKeys {
4+
static var offsetKey = "StackKit_offsetKey"
5+
46
static var widthKey = "StackKit_widthKey"
57
static var heightKey = "StackKit_heightKey"
68

@@ -12,6 +14,8 @@ struct _UIView_StackKitKeys {
1214
}
1315

1416
protocol _UIView_StackKitProvider {
17+
var _stackKit_offset: CGPoint? { get set }
18+
1519
var _stackKit_width: CGFloat? { get set }
1620
var _stackKit_height: CGFloat? { get set }
1721

@@ -24,6 +28,22 @@ protocol _UIView_StackKitProvider {
2428

2529
extension UIView: _UIView_StackKitProvider {
2630

31+
var _stackKit_offset: CGPoint? {
32+
get {
33+
guard let value = Runtime.getProperty(self, key: &_UIView_StackKitKeys.offsetKey) as? NSValue else {
34+
return nil
35+
}
36+
return value.cgPointValue
37+
}
38+
set {
39+
guard let newValue else {
40+
Runtime.setProperty(self, key: &_UIView_StackKitKeys.offsetKey, value: nil, policy: .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
41+
return
42+
}
43+
Runtime.setProperty(self, key: &_UIView_StackKitKeys.offsetKey, value: NSValue(cgPoint: newValue), policy: .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
44+
}
45+
}
46+
2747
var _stackKit_width: CGFloat? {
2848
get {
2949
Runtime.getCGFloatProperty(self, key: &_UIView_StackKitKeys.widthKey)

0 commit comments

Comments
 (0)