在 SwiftUI 中使用图像和 SFSymbol 时如何获得统一的视图大小?

How Do I get uniform view size when using Image and SFSymbols in SwiftUI?

这是我的看法:

我希望所有框(红色矩形)大小相同(高度彼此相等,宽度彼此相等)。它们不需要是方形的。

当我使用 Image(systemname:) 创建视图时,它们具有不同的固有大小。如何在不对大小进行硬编码的情况下使它们大小相同

struct InconsistentSymbolSizes: View {
    let symbols = [ "camera", "comb", "diamond", "checkmark.square"]
    var body: some View {
            HStack(spacing: 0) {
                ForEach(Array(symbols), id: \.self) { item in
                    VStack {
                        Image(systemName: item).font(.largeTitle)
                    }
                    .padding()
                    .background(.white)
                    .border(.red)
                }
            }
            .border(Color.black)
        }
}

如果您想标准化尺寸,可以使用 PreferenceKey 测量最大尺寸并确保所有其他尺寸都扩展到该尺寸:

struct ContentView: View {
    let symbols = [ "camera", "comb", "diamond", "checkmark.square"]
    @State private var itemSize = CGSize.zero
    
    var body: some View {
        HStack(spacing: 0) {
            ForEach(Array(symbols), id: \.self) { item in
                VStack {
                    Image(systemName: item).font(.largeTitle)
                }
                .padding()
                .background(GeometryReader {
                    Color.clear.preference(key: ItemSize.self,
                                           value: [=10=].frame(in: .local).size)
                })
                .frame(width: itemSize.width, height: itemSize.height)
                .border(.red)
            }.onPreferenceChange(ItemSize.self) {
                itemSize = [=10=]
            }
        }
        .border(Color.black)
    }
}

struct ItemSize: PreferenceKey {
    static var defaultValue: CGSize { .zero }
    static func reduce(value: inout Value, nextValue: () -> Value) {
        let next = nextValue()
        value = CGSize(width: max(value.width,next.width),
                       height: max(value.height,next.height))
    }
}