【问题标题】:binding the GeometryReader in swiftui在 swiftui 中绑定 GeometryReader
【发布时间】:2021-09-30 22:42:34
【问题描述】:

如何在子视图中绑定 GeometryReader 的项目?我使用下面的代码但没有工作? 但它显示

不能调用非函数类型'GeometryProxy'的值

绑定它有什么价值吗?

GeometryReader { geometry in
geometry(geometry: geometry}

}
struct geometry: View {
    @Binding var geometry:GeometryProxy
    var body: some View {
                Circle()
                    .foregroundColor(.blue).opacity(0.5).blur(radius: 5)
                    .frame(width: geometry.size.width * 0.04, height: geometry.size.width 
              * 0.04)
}
        
}

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    为了使解决方案更容易理解,这里是一个问题的最小可重现示例:

    struct ContentView: View {
        var body: some View {
            GeometryReader { geometry in
                geometry(geometry: geometry)
            }
        }
    }
    
    struct geometry: View {
        @Binding var geometry: GeometryProxy
    
        var body: some View {
            Circle()
                .foregroundColor(.blue)
                .opacity(0.5)
                .blur(radius: 5)
                .frame(width: geometry.size.width * 0.04, height: geometry.size.width * 0.04)
        }
    }
    

    有两个主要问题:

    1. 您有两个含义不同的geometry 标识符。
    2. 您不能将 Binding 传递给初始化程序。

    #1

    你有一个geometry 是一个GeometryProxy 和另一个geometry 这是一个View。内部的geometry (GeometryProxy) 是首选,因为它在最本地的范围内。这意味着您无法访问geometry 视图。

    你可以通过在视图上使用大写字母来解决这个问题,无论如何你都应该按照惯例这样做(以避免这样的问题):

    struct Geometry: View {
        /* ... */
    }
    

    #2

    现在你已经解决了第一个问题,你现在会得到错误:

    无法将“GeometryProxy”类型的值转换为预期的参数类型“Binding”

    换行解决这个问题:

    @Binding var geometry: GeometryProxy
    

    收件人:

    let geometry: GeometryProxy
    

    【讨论】:

    • 我们也可以说传入的代理只是只读而不是写!因此绑定会出现问题,否则我们使用自定义绑定进行自定义工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多