Высота заполнения SwiftUI GroupBoxStyle

#swiftui

#swiftui

Вопрос:

У меня есть обычай GroupBoxStyle , в котором я хотел бы добавить к его левому краю цветную линию, которая занимает всю высоту GroupedBox. Затем этот GroupedBox используется в строках в VStack

Здесь синим content цветом обозначен GroupBox, желтым — та строка, которую я хочу добавить. Синим содержимым может быть любой вид.

введите описание изображения здесь

В моей текущей реализации (см. Ниже), но проблема в том, что вертикальная линия не занимает всю высоту GroupBox

введите описание изображения здесь

 import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            ScrollView {
                VStack(spacing: 8) {
                    GroupBox {
                        HStack {
                            VStack {
                                Text("Hello")
                                Text("Hello")
                                Text("Hello")
                                Text("Hello")

                            }
                            Spacer()
                        }
                    }

                    GroupBox {
                        Color.blue
                            .frame(height: 50)
                    }
                }
                // try to uncomment this
//                .padding(8)
            }
            .groupBoxStyle(StandardGroupBoxStyle())
            .navigationBarTitle("My Group", displayMode: .large)
        }
    }
}

public struct StandardGroupBoxStyle: GroupBoxStyle {
    public func makeBody(configuration: Self.Configuration) -> some View {
        HStack(spacing: 0) {
            Color.yellow
                .frame(width: 5)
                .frame(maxHeight: .infinity)

            VStack {
                configuration
                    .content
            }
            .border(Color.green)
            Spacer()
        }
        .border(Color.red)
    }
}



struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
 

Эта реализация и пример создают это (обратите внимание, что желтый цвет не занимает всю высоту строки.

введите описание изображения здесь

Ответ №1:

Вот решение (я сохранил оригинальные дополнительные модификаторы, но предполагаю, что они предназначены для отладки). Протестировано с Xcode 12.1 / iOS 14.1

ДЕМОНСТРАЦИЯ

 public struct StandardGroupBoxStyle: GroupBoxStyle {
    public func makeBody(configuration: Self.Configuration) -> some View {
        HStack(spacing: 0) {
            configuration.content
                .padding(.leading, 5)
                .border(Color.green)      // << debug?
            Spacer()                     // << debug?
        }
        .overlay(Color.yellow.frame(width: 5), alignment: .leading)
        .border(Color.red)              // << debug?
    }
}
 

Комментарии:

1. это работает так, как и ожидалось. Интересно, почему мое решение этого не делает. Есть какие-нибудь идеи?