Skip to content

Instantly share code, notes, and snippets.

@robinkanatzar
Last active August 4, 2024 07:37
Show Gist options
  • Save robinkanatzar/6b281658e7bf4cdde73d69f86a4c8a8e to your computer and use it in GitHub Desktop.
Save robinkanatzar/6b281658e7bf4cdde73d69f86a4c8a8e to your computer and use it in GitHub Desktop.
AStack: An accessible stack view that switches from an HStack to a VStack when the dynamic type size is an accessibility size
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 }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment