swift - 是否可以将 GeometryReader 的值传递给 @Observableobject

标签 swift swiftui

我需要根据设备的尺寸和屏幕的宽度进行计算。

struct TranslatorView: View {

@ObservedObject var settings = TranslationViewModel(spacing: 4, charSize: 20)
var body: some View {
    GeometryReader { geometry in
        VStack{
             TextField("Enter your name", text:self.$settings.translateString)               
        }

    }
}
}

下面可以看到我的ObservableObject

class TranslationViewModel: ObservableObject {
    @Published var translateString  = ""
    var ScreenSize : CGFloat = 0
    var spacing : CGFloat = 4
    var charSize : CGFloat = 20

    init(spacing: CGFloat, charSize : CGFloat) {
         self.spacing = spacing
        self.charSize = charSize
     }
}

我需要一种方法将 geometry.size.width 传递给我的 ScreenSize 属性,但不知道如何执行此操作。

最佳答案

最简单的方法是在 ObservableObject 中使用 setter 方法,它返回一个 EmptyView

import SwiftUI

struct TranslatorView: View {
    @ObservedObject var settings = TranslationViewModel(spacing: 4, charSize: 20)
    var body: some View {
        GeometryReader { geometry in
            VStack{
                self.settings.passWidth(geometry: geometry)
                TextField("Enter your name", text:self.$settings.translateString)
            }

        }
    }
}

class TranslationViewModel: ObservableObject {
    @Published var translateString  = ""
    var ScreenSize : CGFloat = 0
    var spacing : CGFloat = 4
    var charSize : CGFloat = 20

    init(spacing: CGFloat, charSize : CGFloat) {
        self.spacing = spacing
        self.charSize = charSize
    }

    func passWidth(geometry: GeometryProxy) -> EmptyView {
        self.ScreenSize = geometry.size.width
        return EmptyView()
    }
}

然后您可以围绕 GeometryReader 实现一个包装器,采用 content: () -> Content 和一个每次 GeometryReader 时都会执行的闭包在您可以更新任何内容的地方重新呈现。

import SwiftUI

struct TranslatorView: View {
    @ObservedObject var settings = TranslationViewModel(spacing: 4, charSize: 20)
    var body: some View {
        GeometryReaderEasy(callback: {
            self.settings.ScreenSize = $0.size.width
        }) { geometry in
            TextField("Enter your name", text:self.$settings.translateString)
        }
    }
}

struct GeometryReaderEasy<Content: View>: View {
    var callback: (GeometryProxy) -> ()
    var content: (GeometryProxy) -> (Content)

    private func setGeometry(geometry: GeometryProxy) -> EmptyView {
        callback(geometry)
        return EmptyView()
    }

    var body: some View {
        GeometryReader { geometry in
            VStack{
                self.setGeometry(geometry: geometry)
                self.content(geometry)
            }
        }
    }
}

关于swift - 是否可以将 GeometryReader 的值传递给 @Observableobject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57597292/

相关文章:

swift - 禁用相机 View 增长动画

macos - 如何在 TextView 中的某个索引处获取字符的行号和列号?

swift - Swift 中相同的结果不同的情况?

swiftui - 当@Binding var 值发生变化时,有什么方法可以调用 withAnimation?

ios - 在 SwiftUI 中使用 SpriteKit

ios - 使用 Swift 自定义 UIStoryboard

ios - 在 UIApplicationWillTerminate 上关闭 rootViewController

list - 将带标题的部分添加到具有可扩展行的 SwiftUI 列表

SwiftUI - 在不修改 View 大小的情况下使用 GeometryReader

swift - 如何根据iOS版本在一个应用中添加两个应用?