swift - 是否可以将 GeometryReader 的值传递给 @Observableobject
问题描述
我需要根据设备的大小和屏幕的宽度进行计算。
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
其中返回一个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
take的包装器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)
}
}
}
}
推荐阅读
- salesforce - 如何提高 Talend Cloud Jobs 的性能以连接销售人员
- android - Firefox PushManager 订阅在 Android 上不起作用
- join - 在视图上显示来自 2 个连接表单的字段值 - Lotus Notes
- python - 如何为包含 Python 安装的 Python 项目制作独立安装程序
- mysql - 从有条件的表中检索最近一小时的记录
- c# - ToList() 中的“InvalidCastException 指定的强制转换无效”
- mysql - MySQL 中的语法错误,但在创建 ROLE 时语法正确
- python - windows 2012 r2 安全事件日志自定义插入
- excel - 公式 MAXIFS 未评估全文值
- azure-api-management - Azure ApiManagement - 限制特定用户的请求