以下是一个简单的例子。您可以创建新的SwiftUI iOS项目并将其复制到ContentView文件中。
import SwiftUI
struct Settings {
static let onOff = "onOff"
}
struct ContentView: View {
@AppStorage(wrappedValue: false, Settings.onOff) var onOff
var body: some View {
NavigationView {
GeometryReader { reader in // < Comment out this line
List {
Section (header:
VStack {
HStack {
Spacer()
VStack {
Text("THIS SHOULD BE FULL-WIDTH")
Text("It is thanks to GeometryReader")
}
Spacer()
}
.padding()
.background(Color.yellow)
HStack {
Text("This should update from AppStorage: ")
Spacer()
Text(onOff == true ? "ON" : "OFF")
}
.padding()
}
.frame(width: reader.size.width) // < Comment out this line
.textCase(nil)
.font(.body)
) {
Toggle(isOn: $onOff) {
Text("ON / OFF")
}
}
}
.listStyle(GroupedListStyle())
} // < Comment out this line
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我有3个元素:
- 黄色背景文字 - 我需要它全宽并使用GeometryReader来实现。
- 普通文本。最后一个词应该根据切换值ON/OFF切换。这只是为了测试AppStorage是否正确工作。
- 开关按钮 - 切换onOff变量并将其保存到AppStorage(UserDefaults)中。
AppStorage在没有GeometryReader时完美工作。请将标记的3行注释掉以进行检查。
这是一个bug吗?还是我的AppStorage代码有问题?或者GeometryReader部分有问题?如果我能将黄色部分全屏幕显示,我就可以完全放弃GeometryReader。
ScrollViewReader
有同样的bug。 - undefined