This post is mainly just meant for rob mayoff, but anybody else is free to help, because I don't know how to contact him other than making a post as I don't have enough reputation to comment.
In your answer on SwiftUI Multiple Labels Vertically Aligned, I tried to implement the code, and even though I changed nothing besides iOS requirements as per XCode warnings, I get the error of Cannot convert value of type 'VStack<TupleView<(Text, Divider, HStack<TupleView<(VStack<TupleView<(Label<Text, Text>, Label<Text, Image>)>>, VStack<TupleView<(Label<Text, Image>, Label<Text, Image>)>>)>>)>>' to closure result type 'Content'
Is this the result of Xcode 13.4.1, or is it something else? I didn't see anybody have issues with the code.
My code structure is:
fileprivate struct IconWidthKey: PreferenceKey {
static var defaultValue: CGFloat? { nil }
static func reduce(value: inout CGFloat?, nextValue: () -> CGFloat?) {
switch (value, nextValue()) {
case (nil, let next): value = next
case (_, nil): break
case (.some(let current), .some(let next)): value = max(current, next)
}
}
}
extension IconWidthKey: EnvironmentKey { }
extension EnvironmentValues {
fileprivate var iconWidth: CGFloat? {
get { self[IconWidthKey.self] }
set { self[IconWidthKey.self] = newValue }
}
}
fileprivate struct IconWidthModifier: ViewModifier {
@Environment(\.iconWidth) var width
func body(content: Content) -> some View {
content
.background(GeometryReader { proxy in
Color.clear
.preference(key: IconWidthKey.self, value: proxy.size.width)
})
.frame(width: width)
}
}
struct EqualIconWidthLabelStyle: LabelStyle {
@available(iOS 14.0, *)
func makeBody(configuration: Configuration) -> some View {
HStack {
configuration.icon.modifier(IconWidthModifier())
configuration.title
}
}
}
@available(iOS 14.0, *)
struct EqualIconWidthDomain<Content: View>: View {
let content: Content
@State var iconWidth: CGFloat? = nil
init(@ViewBuilder _ content: () -> Content) {
self.content = content()
}
var body: some View {
content
.environment(\.iconWidth, iconWidth)
.onPreferenceChange(IconWidthKey.self) { self.iconWidth = $0 }
.labelStyle(EqualIconWidthLabelStyle())
}
struct WelcomeScreen: View{
...
@ViewBuilder
func playWelcomeScreen() -> some View{
...
EqualIconWidthDomain {
VStack {
Text("Le Menu")
.font(.caption)
Divider()
HStack {
VStack(alignment: .leading) {
Label(
title: { Text("Strawberry") },
icon: { Text("") })
Label("Money", systemImage: "banknote")
}
VStack(alignment: .leading) {
Label("People", systemImage: "person.3")
Label("Star", systemImage: "star")
}
}
}
}
...
}
}