import SwiftUI /// An accessible stack view that starts as an HStack /// then becomes a VStack once the dynamic type size /// is an accessibility size. /// /// Usage in a View: /// ``` /// var body: some View { /// AStack(hStackAlignment: .top, hStackSpacing: 100, vStackAlignment: .leading, vStackSpacing: 5) { /// Text("Hello, world!") /// Text("Hello, world!") /// Text("Hello, world!") /// Text("Hello, world!") /// Text("Hello, world!") /// Text("Hello, world!") /// Text("Hello, world!") /// } /// } /// ``` /// /// Article about this gist: https://robinkanatzar.blog/accessibile-stack-in-swiftui-af8630a1cd1d struct AStack<Content>: View where Content: View { @Environment(\.dynamicTypeSize) var dynamicTypeSize let content: Content let hStackAlignment: VerticalAlignment let hStackSpacing: CGFloat? let vStackAlignment: HorizontalAlignment let vStackSpacing: CGFloat? init(hStackAlignment: VerticalAlignment = .center, hStackSpacing: CGFloat? = nil, vStackAlignment: HorizontalAlignment = .center, vStackSpacing: CGFloat? = nil, @ViewBuilder content: () -> Content) { self.hStackAlignment = hStackAlignment self.hStackSpacing = hStackSpacing self.vStackAlignment = vStackAlignment self.vStackSpacing = vStackSpacing self.content = content() } var body: some View { if dynamicTypeSize.isAccessibilitySize { VStack(alignment: vStackAlignment, spacing: vStackSpacing) { content } } else { HStack(alignment: hStackAlignment, spacing: hStackSpacing) { content } } } }