多个GeometryReader导致其他GeometryReader SwiftUI出现问题

时间:2020-03-27 09:18:33

标签: swiftui xcode11.4 geometryreader

我正在使用两个Stack,我有一个UIViewRepresentable,我想将其放在第一个堆栈中,但是对于宽度和高度,我使用GeometryReader来获取宽度和高度,以便UIViewRepresentable将位于第一叠。 同样在第二个堆栈中,我有一个Rectangle,我也想将Rectangle的宽度设置为与第二个堆栈相同,因此我再次使用GeometryReader,现在这会影响第一个堆栈中UIViewRepresentable的帧大小。 >

我正在使用 iOS 13.4 Xcode 11.4

第一个视图和第一个堆栈:

struct BAverage: View {
    @State var bAvg = [10.3, 13.4]

    var body: some View {

        VStack(alignment: .leading, spacing: 0) {

            // MARK: Card Header
            HStack {
                Text("B Average")
                    .bold()
                    .font(.headline)
                Spacer()
            }
            .padding([.top, .horizontal])


            // MARK: Chart
            HStack {
                Spacer()
                GeometryReader { p in
                    LineChartSwiftUI(bAvg: self.$bAvg)
                        .frame(width: p.size.width, height: p.size.height)
                }
                VStack {
                    Text("Average".uppercased())
                        .bold()
                        .font(.system(size: 12))
                        .padding(.top, 10)
                    Text(String(self.bAvg.max() ?? 0.0))
                        .padding()                        
                }
                Spacer()
            }

        }
        .background(Color.green)
        .padding(.horizontal)

    }
}

第二视图和第二堆栈:

struct CAverage: View {

    @State var valee = 80


    var body: some View {
        VStack(alignment: .leading, spacing: 0) {

            // MARK: Card Header
            HStack {
                Text("CAverage")
                    .bold()
                    .font(.headline)
                Spacer()
            }
            .padding()

            // MARK: Chart and Average Temp
            HStack {
                Spacer()
                Text("0")
                GeometryReader { (proxy) in
                    Rectangle()
                        .foregroundColor(Color("Main"))
                        .frame(width: proxy.size.width, height: 4)
                }
                Text("100")
                VStack {
                    Text("LINE")
                }
                Spacer()
            }

        }
        .background(Color.red)
        .padding(.horizontal)
    }
}

,然后在另一个视图中使用这两个视图:

struct ContentView: View {
    var body: some View {
        NavigationView {

            ScrollView {
                    VStack {
                        BAverage()


                        Spacer()
                    }

            }
                // NavigationView Settings
                .navigationBarTitle("Status", displayMode: .automatic)
                // Accent Color
                .accentColor(Color("Main"))
        }
    }
}

您还可以在下图中看到: 无需将 CAverage()放入ContentView: Without putting the CAverage() in ContentView

CAverage()放入ContentView中: After putting the CAverage() in ContentView

0 个答案:

没有答案