Skip to content

Commit 7a0cccf

Browse files
authored
Merge pull request #11 from kkiermasz/layout-guide-relevant-dimensional-layout
Add LayoutGuide relevant DimensionalLayout
2 parents a3acc0f + 8b75ef4 commit 7a0cccf

File tree

7 files changed

+283
-38
lines changed

7 files changed

+283
-38
lines changed

Sources/Neron/Contracts/AnchorLayout/DimensionLayout.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ public protocol DimensionLayout {
3131
@discardableResult
3232
func greaterThanOrEqualTo(_ sibling: UIView, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier
3333

34+
@discardableResult
35+
func equalTo(_ layoutGuide: UILayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier
36+
37+
@discardableResult
38+
func lessThanOrEqualTo(_ layoutGuide: UILayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier
39+
40+
@discardableResult
41+
func greaterThanOrEqualTo(_ layoutGuide: UILayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier
42+
3443
#else
3544

3645
@discardableResult
@@ -42,6 +51,15 @@ public protocol DimensionLayout {
4251
@discardableResult
4352
func greaterThanOrEqualTo(_ sibling: NSView, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier
4453

54+
@discardableResult
55+
func equalTo(_ layoutGuide: NSLayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier
56+
57+
@discardableResult
58+
func lessThanOrEqualTo(_ layoutGuide: NSLayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier
59+
60+
@discardableResult
61+
func greaterThanOrEqualTo(_ layoutGuide: NSLayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier
62+
4563
#endif
4664

4765
}

Sources/Neron/LayoutGuideLayout/AnchorLayout/LayoutGuideLayout+LayoutGuideDimensionLayout.swift

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
extension LayoutGuideLayout {
1313

1414
final class LayoutGuideDimensionLayout: DimensionLayout {
15-
15+
1616
// MARK: - Properties
1717

1818
private let anchor: LayoutAnchor.Dimension
@@ -47,7 +47,11 @@ extension LayoutGuideLayout {
4747
}
4848

4949
func equalTo(_ sibling: View, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
50-
let constraint = LayoutConstraint(item: layoutGuide, itemAttribute: self.anchor.attribute, relation: .equal, target: sibling, targetAttribute: anchor.attribute)
50+
let constraint = LayoutConstraint(item: layoutGuide,
51+
itemAttribute: self.anchor.attribute,
52+
relation: .equal,
53+
target: sibling,
54+
targetAttribute: anchor.attribute)
5155
return makePrioritizer(for: endorse(constraint))
5256
}
5357

@@ -68,7 +72,34 @@ extension LayoutGuideLayout {
6872
targetAttribute: anchor.attribute)
6973
return makePrioritizer(for: endorse(constraint))
7074
}
71-
75+
76+
func equalTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
77+
let constraint = LayoutConstraint(item: self.layoutGuide,
78+
itemAttribute: self.anchor.attribute,
79+
relation: .equal,
80+
target: layoutGuide,
81+
targetAttribute: anchor.attribute)
82+
return makePrioritizer(for: endorse(constraint))
83+
}
84+
85+
func lessThanOrEqualTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
86+
let constraint = LayoutConstraint(item: self.layoutGuide,
87+
itemAttribute: self.anchor.attribute,
88+
relation: .lessThanOrEqual,
89+
target: layoutGuide,
90+
targetAttribute: anchor.attribute)
91+
return makePrioritizer(for: endorse(constraint))
92+
}
93+
94+
func greaterThanOrEqualTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
95+
let constraint = LayoutConstraint(item: self.layoutGuide,
96+
itemAttribute: self.anchor.attribute,
97+
relation: .greaterThanOrEqual,
98+
target: layoutGuide,
99+
targetAttribute: anchor.attribute)
100+
return makePrioritizer(for: endorse(constraint))
101+
}
102+
72103
// MARK: - Private
73104

74105
private func endorse(_ constraint: LayoutConstraint) -> LayoutConstraint {

Sources/Neron/LayoutResult/AnchorLayout/DefaultLayoutResult+ResultDimensionLayout.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
extension DefaultLayoutResult {
1313

1414
final class ResultDimensionLayout: DimensionLayout {
15-
15+
1616
// MARK: - Properties
1717

1818
private let anchor: LayoutAnchor.Dimension
@@ -57,7 +57,19 @@ extension DefaultLayoutResult {
5757
func greaterThanOrEqualTo(_ sibling: View, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
5858
invokerLayout.greaterThanOrEqualTo(sibling, anchor)
5959
}
60-
60+
61+
func equalTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
62+
invokerLayout.equalTo(layoutGuide, anchor)
63+
}
64+
65+
func lessThanOrEqualTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
66+
invokerLayout.lessThanOrEqualTo(layoutGuide, anchor)
67+
}
68+
69+
func greaterThanOrEqualTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
70+
invokerLayout.greaterThanOrEqualTo(layoutGuide, anchor)
71+
}
72+
6173
}
6274

6375
}

Sources/Neron/ViewLayout/AnchorLayout/UIViewLayout+ViewDimensionLayout.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,22 @@ extension ViewLayout {
6060
let constraint = LayoutConstraint(item: view, itemAttribute: self.anchor.attribute, relation: .greaterThanOrEqual, target: sibling, targetAttribute: anchor.attribute)
6161
return makePrioritizer(for: endorse(constraint))
6262
}
63-
63+
64+
func equalTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
65+
let constraint = LayoutConstraint(item: view, itemAttribute: self.anchor.attribute, relation: .equal, target: layoutGuide, targetAttribute: anchor.attribute)
66+
return makePrioritizer(for: endorse(constraint))
67+
}
68+
69+
func lessThanOrEqualTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
70+
let constraint = LayoutConstraint(item: view, itemAttribute: self.anchor.attribute, relation: .lessThanOrEqual, target: layoutGuide, targetAttribute: anchor.attribute)
71+
return makePrioritizer(for: endorse(constraint))
72+
}
73+
74+
func greaterThanOrEqualTo(_ layoutGuide: LayoutGuide, _ anchor: LayoutAnchor.Dimension) -> ConstraintMultiplier {
75+
let constraint = LayoutConstraint(item: view, itemAttribute: self.anchor.attribute, relation: .greaterThanOrEqual, target: layoutGuide, targetAttribute: anchor.attribute)
76+
return makePrioritizer(for: endorse(constraint))
77+
}
78+
6479
// MARK: - Private
6580

6681
private func endorse(_ constraint: LayoutConstraint) -> LayoutConstraint {

Tests/NeronTests/LayoutGuideLayout/LayoutGuideLayout+Layout+Dimension+Tests.swift

Lines changed: 96 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ final class LayoutGuideLayout_Layout_Dimension_Tests: XCTestCase {
6060

6161
func test_height_EqualToSibling() {
6262
let guide = LayoutGuide()
63-
print(parent.frame)
6463
let constraint = guide.layout
6564
.add(to: parent)
6665
.height.equalTo(parent, .height)
@@ -73,30 +72,73 @@ final class LayoutGuideLayout_Layout_Dimension_Tests: XCTestCase {
7372

7473
func test_height_LessThanOrEqualToSibling() {
7574
let guide = LayoutGuide()
76-
print(parent.frame)
7775
let constraint = guide.layout
7876
.add(to: parent)
79-
.height.equalTo(parent, .height)
77+
.height.lessThanOrEqualTo(parent, .height)
8078
.activate()
8179
.constraint
8280
parent.prepare()
8381
XCTAssertLessThanOrEqual(guide.frame.height, 200, "Height should be 200")
84-
XCTAssertEqual(constraint.relation, .equal, "Relation should be lessThanOrEqual")
82+
XCTAssertEqual(constraint.relation, .lessThanOrEqual, "Relation should be lessThanOrEqual")
8583
}
8684

8785
func test_height_GreaterThanOrEqualToSibling() {
8886
let guide = LayoutGuide()
89-
print(parent.frame)
9087
let constraint = guide.layout
9188
.add(to: parent)
92-
.height.equalTo(parent, .height)
89+
.height.greaterThanOrEqualTo(parent, .height)
9390
.activate()
9491
.constraint
9592
parent.prepare()
9693
XCTAssertGreaterThanOrEqual(guide.frame.height, 200, "Height should be 200")
97-
XCTAssertEqual(constraint.relation, .equal, "Relation should be greaterThanOrEqual")
94+
XCTAssertEqual(constraint.relation, .greaterThanOrEqual, "Relation should be greaterThanOrEqual")
9895
}
99-
96+
97+
func test_Height_EqualToLayoutGuide() {
98+
let height: CGFloat = 150
99+
let parent = TestView(height: height)
100+
let parentGuide = parent.layoutGuide
101+
let guide = LayoutGuide()
102+
let constraint = guide.layout
103+
.add(to: parent)
104+
.height.equalTo(parentGuide, .height)
105+
.activate()
106+
.constraint
107+
parent.prepare()
108+
XCTAssertEqual(guide.frame.height, height, "Height should be \(height)")
109+
XCTAssertEqual(constraint.relation, .equal, "Relation should be equal")
110+
}
111+
112+
func test_Height_LessThanOrEqualToLayoutGuide() {
113+
let height: CGFloat = 150
114+
let parent = TestView(height: height)
115+
let parentGuide = parent.layoutGuide
116+
let guide = LayoutGuide()
117+
let constraint = guide.layout
118+
.add(to: parent)
119+
.height.lessThanOrEqualTo(parentGuide, .height)
120+
.activate()
121+
.constraint
122+
parent.prepare()
123+
XCTAssertEqual(guide.frame.height, height, "Height should be \(height)")
124+
XCTAssertEqual(constraint.relation, .lessThanOrEqual, "Relation should be lessThanOrEqual")
125+
}
126+
127+
func test_Height_GreaterThanOrEqualToLayoutGuide() {
128+
let height: CGFloat = 150
129+
let parent = TestView(height: height)
130+
let parentGuide = parent.layoutGuide
131+
let guide = LayoutGuide()
132+
let constraint = guide.layout
133+
.add(to: parent)
134+
.height.greaterThanOrEqualTo(parentGuide, .height)
135+
.activate()
136+
.constraint
137+
parent.prepare()
138+
XCTAssertEqual(guide.frame.height, height, "Height should be \(height)")
139+
XCTAssertEqual(constraint.relation, .greaterThanOrEqual, "Relation should be greaterThanOrEqual")
140+
}
141+
100142
// MARK: - Width
101143

102144
func test_width_EqualToConstant() {
@@ -137,7 +179,6 @@ final class LayoutGuideLayout_Layout_Dimension_Tests: XCTestCase {
137179

138180
func test_width_EqualToSibling() {
139181
let guide = LayoutGuide()
140-
print(parent.frame)
141182
let constraint = guide.layout
142183
.add(to: parent)
143184
.width.equalTo(parent, .width)
@@ -150,7 +191,6 @@ final class LayoutGuideLayout_Layout_Dimension_Tests: XCTestCase {
150191

151192
func test_width_LessThanOrEqualToSibling() {
152193
let guide = LayoutGuide()
153-
print(parent.frame)
154194
let constraint = guide.layout
155195
.add(to: parent)
156196
.width.equalTo(parent, .width)
@@ -163,7 +203,6 @@ final class LayoutGuideLayout_Layout_Dimension_Tests: XCTestCase {
163203

164204
func test_width_GreaterThanOrEqualToSibling() {
165205
let guide = LayoutGuide()
166-
print(parent.frame)
167206
let constraint = guide.layout
168207
.add(to: parent)
169208
.width.equalTo(parent, .width)
@@ -173,5 +212,50 @@ final class LayoutGuideLayout_Layout_Dimension_Tests: XCTestCase {
173212
XCTAssertGreaterThanOrEqual(guide.frame.width, 200, "Width should be 200")
174213
XCTAssertEqual(constraint.relation, .equal, "Relation should be greaterThanOrEqual")
175214
}
176-
215+
216+
func test_Width_EqualToLayoutGuide() {
217+
let width: CGFloat = 150
218+
let parent = TestView(width: width)
219+
let parentGuide = parent.layoutGuide
220+
let guide = LayoutGuide()
221+
let constraint = guide.layout
222+
.add(to: parent)
223+
.width.equalTo(parentGuide, .width)
224+
.activate()
225+
.constraint
226+
parent.prepare()
227+
XCTAssertEqual(guide.frame.width, width, "Width should be \(width)")
228+
XCTAssertEqual(constraint.relation, .equal, "Relation should be equal")
229+
}
230+
231+
func test_Width_LessThanOrEqualToLayoutGuide() {
232+
let width: CGFloat = 150
233+
let parent = TestView(width: width)
234+
let parentGuide = parent.layoutGuide
235+
let guide = LayoutGuide()
236+
let constraint = guide.layout
237+
.add(to: parent)
238+
.width.lessThanOrEqualTo(parentGuide, .width)
239+
.activate()
240+
.constraint
241+
parent.prepare()
242+
XCTAssertEqual(guide.frame.width, width, "Width should be \(width)")
243+
XCTAssertEqual(constraint.relation, .lessThanOrEqual, "Relation should be lessThanOrEqual")
244+
}
245+
246+
func test_Width_GreaterThanOrEqualToLayoutGuide() {
247+
let width: CGFloat = 150
248+
let parent = TestView(width: width)
249+
let parentGuide = parent.layoutGuide
250+
let guide = LayoutGuide()
251+
let constraint = guide.layout
252+
.add(to: parent)
253+
.width.greaterThanOrEqualTo(parentGuide, .width)
254+
.activate()
255+
.constraint
256+
parent.prepare()
257+
XCTAssertEqual(guide.frame.width, width, "Width should be \(width)")
258+
XCTAssertEqual(constraint.relation, .greaterThanOrEqual, "Relation should be greaterThanOrEqual")
259+
}
260+
177261
}

Tests/NeronTests/TestClasses/TestView.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
// Copyright © 2020 Jakub Kiermasz. All rights reserved.
33
//
44

5-
65
@testable import Neron
76

87
final class TestView: View {
98

109
// MARK: - Properties
1110

12-
let width: CGFloat = 200
13-
let height: CGFloat = 200
11+
let width: CGFloat
12+
let height: CGFloat
1413

1514
// MARK: - Getters
1615

@@ -26,7 +25,9 @@ final class TestView: View {
2625

2726
// MARK: - Initialization
2827

29-
init() {
28+
init(width: CGFloat = 200, height: CGFloat = 200) {
29+
self.width = width
30+
self.height = height
3031
super.init(frame: CGRect(x: 0, y: 0, width: width, height: height))
3132
}
3233

0 commit comments

Comments
 (0)