-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathHStackSnap.swift
66 lines (47 loc) · 1.86 KB
/
HStackSnap.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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import Foundation
import SwiftUI
public struct HStackSnap<Content: View>: View {
// MARK: Lifecycle
@Binding var selectedIndex: Int?
public init(
alignment: SnapAlignment,
selectedIndex: Binding<Int>? = nil,
spacing: CGFloat? = nil,
coordinateSpace: String = "SnapToScroll",
@ViewBuilder content: @escaping () -> Content,
eventHandler: SnapToScrollEventHandler? = .none) {
self.content = content
self._selectedIndex = selectedIndex != nil ? Binding<Int?>(selectedIndex!) : .constant(nil)
self.alignment = alignment
self.leadingOffset = alignment.scrollOffset
self.spacing = spacing
self.coordinateSpace = coordinateSpace
self.eventHandler = eventHandler
}
// MARK: Public
public var body: some View {
func calculatedItemWidth(parentWidth: CGFloat, offset: CGFloat) -> CGFloat {
print(parentWidth)
return parentWidth - offset * 2
}
return GeometryReader { geometry in
HStackSnapCore(
leadingOffset: leadingOffset,
selectedIndex: $selectedIndex,
spacing: spacing,
coordinateSpace: coordinateSpace,
content: content,
eventHandler: eventHandler)
.environmentObject(SizeOverride(itemWidth: alignment.shouldSetWidth ? calculatedItemWidth(parentWidth: geometry.size.width, offset: alignment.scrollOffset) : .none))
}
}
// MARK: Internal
var content: () -> Content
// MARK: Private
private let alignment: SnapAlignment
/// Calculated offset based on `SnapLocation`
private let leadingOffset: CGFloat
private let spacing: CGFloat?
private var eventHandler: SnapToScrollEventHandler?
private let coordinateSpace: String
}