Skip to content

Commit

Permalink
Merge pull request #14 from xcuYao/dev_neo
Browse files Browse the repository at this point in the history
Support lineSpacing
  • Loading branch information
dkk authored Feb 18, 2022
2 parents 3cc84e7 + 8856ea1 commit 25de523
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 15 deletions.
6 changes: 4 additions & 2 deletions Sources/WrappingHStack/InternalWrappingHStack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ struct InternalWrappingHStack: View {
let spacing: WrappingHStack.Spacing
let content: [WrappingHStack.ViewType]
let firstItemOfEachLane: [Int]
let lineSpacing: CGFloat

init(width: CGFloat, alignment: HorizontalAlignment, spacing: WrappingHStack.Spacing, content: [WrappingHStack.ViewType]) {
init(width: CGFloat, alignment: HorizontalAlignment, spacing: WrappingHStack.Spacing, lineSpacing: CGFloat, content: [WrappingHStack.ViewType]) {
self.width = width
self.alignment = alignment
self.spacing = spacing
self.lineSpacing = lineSpacing
self.content = content

firstItemOfEachLane = content
Expand Down Expand Up @@ -69,7 +71,7 @@ struct InternalWrappingHStack: View {
}

var body: some View {
VStack(alignment: alignment, spacing: 0) {
VStack(alignment: alignment, spacing: lineSpacing) {
ForEach(0 ..< totalLanes, id: \.self) { laneIndex in
HStack(spacing: 0) {
if alignment == .center || alignment == .trailing, shouldHaveSideSpacers(lane: laneIndex) {
Expand Down
35 changes: 24 additions & 11 deletions Sources/WrappingHStack/WrappingHStack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public struct WrappingHStack: View {
let items: [ViewType]
let alignment: HorizontalAlignment
let spacing: Spacing
let lineSpacing: CGFloat
@State private var height: CGFloat = 0

public var body: some View {
Expand All @@ -54,6 +55,7 @@ public struct WrappingHStack: View {
width: geo.frame(in: .global).width,
alignment: alignment,
spacing: spacing,
lineSpacing: lineSpacing,
content: items
)
.anchorPreference(
Expand Down Expand Up @@ -93,44 +95,50 @@ public extension WrappingHStack {
/// `.dynamicIncludingBorders` to fill the full width with equal spacing
/// between items and from the items to the border.
/// - content: The content and behavior of the view.
init<Data: RandomAccessCollection, Content: View>(_ data: Data, id: KeyPath<Data.Element, Data.Element> = \.self, alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: @escaping (Data.Element) -> Content) {
init<Data: RandomAccessCollection, Content: View>(_ data: Data, id: KeyPath<Data.Element, Data.Element> = \.self, alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: @escaping (Data.Element) -> Content) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = data.map { Self.viewType(from: content($0[keyPath: id])) }
}

init<A: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> A) {
init<A: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> A) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content())]
}

init<A: View, B: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B)>) {
init<A: View, B: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1)]
}

init<A: View, B: View, C: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B, C)>) {
init<A: View, B: View, C: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B, C)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1),
Self.viewType(from: content().value.2)]
}

init<A: View, B: View, C: View, D: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B, C, D)>) {
init<A: View, B: View, C: View, D: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B, C, D)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1),
Self.viewType(from: content().value.2),
Self.viewType(from: content().value.3)]
}

init<A: View, B: View, C: View, D: View, E: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B, C, D, E)>) {
init<A: View, B: View, C: View, D: View, E: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B, C, D, E)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1),
Expand All @@ -139,8 +147,9 @@ public extension WrappingHStack {
Self.viewType(from: content().value.4)]
}

init<A: View, B: View, C: View, D: View, E: View, F: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F)>) {
init<A: View, B: View, C: View, D: View, E: View, F: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1),
Expand All @@ -150,8 +159,9 @@ public extension WrappingHStack {
Self.viewType(from: content().value.5)]
}

init<A: View, B: View, C: View, D: View, E: View, F: View, G: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F, G)>) {
init<A: View, B: View, C: View, D: View, E: View, F: View, G: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F, G)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1),
Expand All @@ -162,8 +172,9 @@ public extension WrappingHStack {
Self.viewType(from: content().value.6)]
}

init<A: View, B: View, C: View, D: View, E: View, F: View, G: View, H: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F, G, H)>) {
init<A: View, B: View, C: View, D: View, E: View, F: View, G: View, H: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F, G, H)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1),
Expand All @@ -175,8 +186,9 @@ public extension WrappingHStack {
Self.viewType(from: content().value.7)]
}

init<A: View, B: View, C: View, D: View, E: View, F: View, G: View, H: View, I: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F ,G, H, I)>) {
init<A: View, B: View, C: View, D: View, E: View, F: View, G: View, H: View, I: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F ,G, H, I)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1),
Expand All @@ -189,8 +201,9 @@ public extension WrappingHStack {
Self.viewType(from: content().value.8)]
}

init<A: View, B: View, C: View, D: View, E: View, F: View, G: View, H: View, I: View, J: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F ,G, H, I, J)>) {
init<A: View, B: View, C: View, D: View, E: View, F: View, G: View, H: View, I: View, J: View>(alignment: HorizontalAlignment = .leading, spacing: Spacing = .constant(8), lineSpacing: CGFloat = 0, @ViewBuilder content: () -> TupleView<(A, B, C, D, E, F ,G, H, I, J)>) {
self.spacing = spacing
self.lineSpacing = lineSpacing
self.alignment = alignment
self.items = [Self.viewType(from: content().value.0),
Self.viewType(from: content().value.1),
Expand Down
4 changes: 2 additions & 2 deletions WrappingHStackExample/WrappingHStackExample/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ struct ExampleView: View {
@State var exampleType: ExampleType

func example(alignment: HorizontalAlignment, spacing: WrappingHStack.Spacing) -> some View {
WrappingHStack(alignment: alignment, spacing: spacing) {
WrappingHStack(alignment: alignment, spacing: spacing, lineSpacing: 10) {
Text("WrappingHStack")

Image(systemName: "scribble")
Expand All @@ -28,7 +28,7 @@ struct ExampleView: View {
Text("bcdefghijklmnopqrs")
.font(.title)

WrappingHStack(1...9, id:\.self, alignment: alignment, spacing: spacing) {
WrappingHStack(1...9, id:\.self, alignment: alignment, spacing: spacing, lineSpacing: 10) {
Text("Item: \($0)")
.padding(.all, 12)
.background(RoundedRectangle(cornerRadius: 10).stroke())
Expand Down

0 comments on commit 25de523

Please sign in to comment.