This repository was archived by the owner on Dec 27, 2020. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathLayoutMath.swift
47 lines (42 loc) · 1.95 KB
/
LayoutMath.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import SwiftUI
func itemLength(tracks: Tracks, spacing: CGFloat, availableLength: CGFloat) -> CGFloat {
switch tracks {
case .count(let count):
return itemLength(tracksCount: count, spacing: spacing, availableLength: availableLength)
case .fixed(let length):
return length
case .min:
let suggestedTracksCount = tracksCount(tracks: tracks, spacing: spacing, availableLength: availableLength)
return itemLength(tracksCount: suggestedTracksCount, spacing: spacing, availableLength: availableLength)
}
}
func tracksCount(tracks: Tracks, spacing: CGFloat, availableLength: CGFloat) -> Int {
switch tracks {
case .count(let count):
return count
case .fixed(let length):
precondition(length > 0, "Minimum track length should be greated than 0")
let columnCount = Int(availableLength / length)
for columns in (0...columnCount).reversed() {
let suggestedItemWidth = itemLength(tracksCount: columns, spacing: spacing, availableLength: availableLength)
if (suggestedItemWidth * CGFloat(columns)) + (CGFloat(columns - 1) * spacing) <= availableLength {
return columns
}
}
return 1
case .min(let length):
precondition(length > 0, "Minimum track length should be greated than 0")
let columnCount = Int(availableLength / length)
for columns in (0...columnCount).reversed() {
let suggestedItemWidth = itemLength(tracksCount: columns, spacing: spacing, availableLength: availableLength)
if (suggestedItemWidth * CGFloat(columns)) + (CGFloat(columns - 1) * spacing) <= availableLength {
return columns
}
}
return 1
}
}
func itemLength(tracksCount: Int, spacing: CGFloat, availableLength: CGFloat) -> CGFloat {
let width = availableLength - (spacing * (CGFloat(tracksCount) - 1))
return (width / CGFloat(tracksCount))
}