如何在 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)")
}
我在 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)")
}