Swiftui 在ScrollView中使用GeometryReader
我正在尝试使用Swiftui 在ScrollView中使用GeometryReader,swiftui,Swiftui,我正在尝试使用GeometryReader为滚动视图中的列表指定最大高度 出于这个问题的目的,我创建了以下项目: 它用: -文本。 -列表。 -文本。 我使用@ViewBuilder将列表和最后一个文本提取到它们自己的视图中,我想将列表的最大高度设置为用户屏幕的0.5高度 问题是,应用程序不会生成以下错误,并且GeometryReader似乎没有计算正确的高度: 这是我的ContentView代码,如果有人知道我做错了什么 struct ContentView: View { let
GeometryReader
为滚动视图中的列表指定最大高度
出于这个问题的目的,我创建了以下项目:
它用:
-文本。
-列表。
-文本。
我使用@ViewBuilder
将列表和最后一个文本提取到它们自己的视图中,我想将列表的最大高度设置为用户屏幕的0.5高度
问题是,应用程序不会生成以下错误,并且GeometryReader似乎没有计算正确的高度:
这是我的ContentView代码,如果有人知道我做错了什么
struct ContentView: View {
let arrayWithStuff = [ "one","two","three","four","five","six","seven","eight","nine","ten", "eleven", "twelve"]
var heightOfView: CGFloat = 0.0 // To be set by GeometryReader
var body: some View {
let myString = "Top of Test App"
return ZStack {
GeometryReader { g in
heightOfView = g.size.height
NavigationView {
print("height of view : \(heightOfView)")
ScrollView {
VStack {
Text(myString)
.padding()
Divider()
self.ViewBody()
} // END of Vstack
.navigationBarTitle("Test App", displayMode: .inline)
} // END of Scrollview
}//End of NavigationView
} // End of Geometry reader
} // End of Zstack
} // End of body
@ViewBuilder func ViewBody() -> some View {
VStack {
List {
ForEach (self.arrayWithStuff, id: \.self) { item in
Text(item) }
} // END of List
.frame(maxHeight: heightOfView*0.5)
Divider()
Text("Bottom of TEST APP")
}
.padding()
}
}
再次感谢您的帮助。这里是一个可能解决方案的演示。使用Xcode 11.4进行测试
感谢Asperi,我的问题之一似乎是在geometryReader中指定属性。。?谢谢你的帮助。
struct ContentView: View {
let arrayWithStuff = [ "one","two","three","four","five","six","seven","eight","nine","ten", "eleven", "twelve"]
var body: some View {
let myString = "Top of Test App"
return ZStack {
GeometryReader { g in
NavigationView {
ScrollView {
VStack {
Text(myString)
.padding()
Divider()
self.ViewBody(height: g.size.height)
} // END of Vstack
.navigationBarTitle("Test App", displayMode: .inline)
} // END of Scrollview
}//End of NavigationView
} // End of Geometry reader
} // End of Zstack
} // End of body
func ViewBody(height: CGFloat) -> some View {
print("height of view : \(height)")
return VStack {
List {
ForEach (self.arrayWithStuff, id: \.self) { item in
Text(item) }
} // END of List
.frame(height: height*0.5)
Divider()
Text("Bottom of TEST APP")
}
.padding()
}
}