Skip to content
This repository was archived by the owner on Dec 27, 2020. It is now read-only.

Commit 9eb16bf

Browse files
porterjamesjay42
authored andcommitted
Fix grid ids (#65)
* try to make item IDs work correctly * Add back tuple initializers
1 parent 40bf1ea commit 9eb16bf

File tree

2 files changed

+79
-25
lines changed

2 files changed

+79
-25
lines changed

Sources/Grid/Grid+Inits.swift

Lines changed: 66 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,48 +2,97 @@ import SwiftUI
22

33
extension Grid {
44
public init<Data, Item>(_ data: Data, @ViewBuilder item: @escaping (Data.Element) -> Item) where Content == ForEach<Data, Data.Element.ID, Item>, Data : RandomAccessCollection, Item : View, Data.Element : Identifiable {
5-
self.items = data.map({ AnyView(item($0)) })
5+
self.items = data.map { GridItem(view: AnyView(item($0)), id: AnyHashable($0.id)) }
66
}
77

88
public init<Data, ID, Item>(_ data: Data, id: KeyPath<Data.Element, ID>, @ViewBuilder item: @escaping (Data.Element) -> Item) where Content == ForEach<Data, ID, Item>, Data : RandomAccessCollection, ID : Hashable, Item : View {
9-
self.items = data.map({ AnyView(item($0)) })
9+
self.items = data.map { GridItem(view: AnyView(item($0)), id: AnyHashable($0[keyPath: id])) }
1010
}
1111

1212
public init<Item>(_ data: Range<Int>, @ViewBuilder item: @escaping (Int) -> Item) where Content == ForEach<Range<Int>, Int, Item>, Item : View {
13-
self.items = data.map({ AnyView(item($0)) })
13+
self.items = data.map { GridItem(view: AnyView(item($0)), id: AnyHashable($0)) }
1414
}
1515
}
1616

1717
extension Grid {
1818
public init<C0: View, C1: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1)> {
19-
self.items = [AnyView(content().value.0), AnyView(content().value.1)]
19+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
20+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1))]
2021
}
21-
22+
2223
public init<C0: View, C1: View, C2: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1, C2)> {
23-
self.items = [AnyView(content().value.0), AnyView(content().value.1), AnyView(content().value.2)]
24+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
25+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1)),
26+
GridItem(view: AnyView(content().value.2), id: AnyHashable(2))]
2427
}
25-
28+
2629
public init<C0: View, C1: View, C2: View, C3: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1, C2, C3)> {
27-
self.items = [AnyView(content().value.0), AnyView(content().value.1), AnyView(content().value.2), AnyView(content().value.3)]
30+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
31+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1)),
32+
GridItem(view: AnyView(content().value.2), id: AnyHashable(2)),
33+
GridItem(view: AnyView(content().value.3), id: AnyHashable(3))]
2834
}
2935

3036
public init<C0: View, C1: View, C2: View, C3: View, C4: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1, C2, C3, C4)> {
31-
self.items = [AnyView(content().value.0), AnyView(content().value.1), AnyView(content().value.2), AnyView(content().value.3), AnyView(content().value.4)]
37+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
38+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1)),
39+
GridItem(view: AnyView(content().value.2), id: AnyHashable(2)),
40+
GridItem(view: AnyView(content().value.3), id: AnyHashable(3)),
41+
GridItem(view: AnyView(content().value.4), id: AnyHashable(4))]
3242
}
33-
43+
3444
public init<C0: View, C1: View, C2: View, C3: View, C4: View, C5: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1, C2, C3, C4, C5)> {
35-
self.items = [AnyView(content().value.0), AnyView(content().value.1), AnyView(content().value.2), AnyView(content().value.3), AnyView(content().value.4), AnyView(content().value.5)]
45+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
46+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1)),
47+
GridItem(view: AnyView(content().value.2), id: AnyHashable(2)),
48+
GridItem(view: AnyView(content().value.3), id: AnyHashable(3)),
49+
GridItem(view: AnyView(content().value.4), id: AnyHashable(4)),
50+
GridItem(view: AnyView(content().value.5), id: AnyHashable(5))]
3651
}
37-
52+
3853
public init<C0: View, C1: View, C2: View, C3: View, C4: View, C5: View, C6: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1, C2, C3, C4, C5, C6)> {
39-
self.items = [AnyView(content().value.0), AnyView(content().value.1), AnyView(content().value.2), AnyView(content().value.3), AnyView(content().value.4), AnyView(content().value.5), AnyView(content().value.6)]
54+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
55+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1)),
56+
GridItem(view: AnyView(content().value.2), id: AnyHashable(2)),
57+
GridItem(view: AnyView(content().value.3), id: AnyHashable(3)),
58+
GridItem(view: AnyView(content().value.4), id: AnyHashable(4)),
59+
GridItem(view: AnyView(content().value.5), id: AnyHashable(5)),
60+
GridItem(view: AnyView(content().value.6), id: AnyHashable(6))]
4061
}
41-
62+
63+
public init<C0: View, C1: View, C2: View, C3: View, C4: View, C5: View, C6: View, C7: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1, C2, C3, C4, C5, C6, C7)> {
64+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
65+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1)),
66+
GridItem(view: AnyView(content().value.2), id: AnyHashable(2)),
67+
GridItem(view: AnyView(content().value.3), id: AnyHashable(3)),
68+
GridItem(view: AnyView(content().value.4), id: AnyHashable(4)),
69+
GridItem(view: AnyView(content().value.5), id: AnyHashable(5)),
70+
GridItem(view: AnyView(content().value.6), id: AnyHashable(6)),
71+
GridItem(view: AnyView(content().value.7), id: AnyHashable(7))]
72+
}
73+
4274
public init<C0: View, C1: View, C2: View, C3: View, C4: View, C5: View, C6: View, C7: View, C8: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8)> {
43-
self.items = [AnyView(content().value.0), AnyView(content().value.1), AnyView(content().value.2), AnyView(content().value.3), AnyView(content().value.4), AnyView(content().value.5), AnyView(content().value.6), AnyView(content().value.7), AnyView(content().value.8)]
75+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
76+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1)),
77+
GridItem(view: AnyView(content().value.2), id: AnyHashable(2)),
78+
GridItem(view: AnyView(content().value.3), id: AnyHashable(3)),
79+
GridItem(view: AnyView(content().value.4), id: AnyHashable(4)),
80+
GridItem(view: AnyView(content().value.5), id: AnyHashable(5)),
81+
GridItem(view: AnyView(content().value.6), id: AnyHashable(6)),
82+
GridItem(view: AnyView(content().value.7), id: AnyHashable(7)),
83+
GridItem(view: AnyView(content().value.8), id: AnyHashable(8))]
4484
}
45-
85+
4686
public init<C0: View, C1: View, C2: View, C3: View, C4: View, C5: View, C6: View, C7: View, C8: View, C9: View>(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8, C9)> {
47-
self.items = [AnyView(content().value.0), AnyView(content().value.1), AnyView(content().value.2), AnyView(content().value.3), AnyView(content().value.4), AnyView(content().value.5), AnyView(content().value.6), AnyView(content().value.7), AnyView(content().value.8), AnyView(content().value.9)]
87+
self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)),
88+
GridItem(view: AnyView(content().value.1), id: AnyHashable(1)),
89+
GridItem(view: AnyView(content().value.2), id: AnyHashable(2)),
90+
GridItem(view: AnyView(content().value.3), id: AnyHashable(3)),
91+
GridItem(view: AnyView(content().value.4), id: AnyHashable(4)),
92+
GridItem(view: AnyView(content().value.5), id: AnyHashable(5)),
93+
GridItem(view: AnyView(content().value.6), id: AnyHashable(6)),
94+
GridItem(view: AnyView(content().value.7), id: AnyHashable(7)),
95+
GridItem(view: AnyView(content().value.8), id: AnyHashable(8)),
96+
GridItem(view: AnyView(content().value.9), id: AnyHashable(9))]
4897
}
4998
}

Sources/Grid/Grid.swift

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import SwiftUI
22

3+
struct GridItem: Identifiable {
4+
let view: AnyView
5+
let id: AnyHashable
6+
}
7+
38
/// A view that arranges its children in a grid.
49
public struct Grid<Content>: View where Content: View {
510
@Environment(\.gridStyle) private var style
6-
let items: [AnyView]
11+
let items: [GridItem]
712
@State private var itemsPreferences: [AnyHashable : GridItemPreferences] = [:]
813

914
public var body: some View {
@@ -26,15 +31,15 @@ public struct Grid<Content>: View where Content: View {
2631
private func grid(with geometry: GeometryProxy) -> some View {
2732
ScrollView(self.style.axis == .vertical ? .vertical : .horizontal) {
2833
ZStack(alignment: .topLeading) {
29-
ForEach(0..<self.items.count, id: \.self) { index in
30-
self.items[index]
34+
ForEach(self.items) { item in
35+
item.view
3136
.frame(
32-
width: self.style.autoWidth ? self.itemsPreferences[AnyHashable(index)]?.bounds.width : nil,
33-
height: self.style.autoHeight ? self.itemsPreferences[AnyHashable(index)]?.bounds.height : nil
37+
width: self.style.autoWidth ? self.itemsPreferences[item.id]?.bounds.width : nil,
38+
height: self.style.autoHeight ? self.itemsPreferences[item.id]?.bounds.height : nil
3439
)
35-
.alignmentGuide(.leading, computeValue: { _ in self.itemsPreferences[AnyHashable(index)]?.bounds.origin.x ?? 0 })
36-
.alignmentGuide(.top, computeValue: { _ in self.itemsPreferences[AnyHashable(index)]?.bounds.origin.y ?? 0 })
37-
.background(GridItemPreferencesModifier(id: AnyHashable(index), bounds: self.itemsPreferences[AnyHashable(index)]?.bounds ?? .zero))
40+
.alignmentGuide(.leading, computeValue: { _ in self.itemsPreferences[item.id]?.bounds.origin.x ?? 0 })
41+
.alignmentGuide(.top, computeValue: { _ in self.itemsPreferences[item.id]?.bounds.origin.y ?? 0 })
42+
.background(GridItemPreferencesModifier(id: item.id, bounds: self.itemsPreferences[item.id]?.bounds ?? .zero))
3843
.anchorPreference(key: GridItemBoundsPreferencesKey.self, value: .bounds) { [geometry[$0]] }
3944
}
4045
}

0 commit comments

Comments
 (0)