如何在 ViewBuilder 之外使用 GeometryProxy?

How to use GeometryProxy outside of a ViewBuilder?

我在 GeometryReader 上实现了 BasicContainer,具有 @ViewBuilder 的功能。声明内容的时候怎么用这个insideGeometryProxy,outside?

这是我的 BasicContainer:

struct BasicContainer<Content : View> : View {
    
    let content : Content
    
    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }
    
    var body: some View {
        GeometryReader { proxy in
            content
                .frame(width: proxy.size.width * 0.3, height: 200)
                // do some other fancy stuff ...       
        }
    }
}

一切正常,当我按原样使用 BasicContainer 时:

struct ContentView: View { 
    var body: some View {
        BasicContainer {
            Text("Roberts BasicContainer")
        }
    }
}

但是,如果我想让 GeometryProxy 也在 外部 ,(就像 Apple 实现他们的 GeometryReader 一样),就像这样:

BasicContainer { outsideGeo in 
         Text("Width: \(outsideGeo.size.width)")
}

我想某种 @Binding 可以解决这个问题,但到目前为止我没能成功。 这甚至有可能实现吗?

非常感谢任何帮助!!!

这应该有效:

let content : (GeometryProxy) -> Content

init(@ViewBuilder content: @escaping (GeometryProxy) -> Content) {
    self.content = content
}

然后:

GeometryReader { proxy in
        content(proxy)
            .frame(width: proxy.size.width * 0.3, height: 200)
            // do some other fancy stuff ...       
    }

编辑:我假设你的 geometryproxy 被命名为 proxy。 -> 显式实现以避免混淆。

调用容器时,您可以:

BasicContainer { outsideGeo in 
     Text("Width: \(outsideGeo.size.width)")
}