Swiftui 当父视图位于scrollview中时,如何相对于父视图调整视图的大小?
我试图动态调整一些视图的大小,这些视图最终被放置在scrollview中。下面是我能想到的最简单的示例代码:Swiftui 当父视图位于scrollview中时,如何相对于父视图调整视图的大小?,swiftui,Swiftui,我试图动态调整一些视图的大小,这些视图最终被放置在scrollview中。下面是我能想到的最简单的示例代码: struct RootView: View { var body: some View { ScrollView { VStack(alignment: .leading) { // More views above HStack(spacing: 16) {
struct RootView: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
// More views above
HStack(spacing: 16) {
MyView()
MyView()
}
.padding([.leading, .trailing], 16)
// More views below
}
}
}
}
struct MyView: View {
var body: some View {
VStack(alignment: .leading, spacing: 24) {
Image("myImage")
.resizable()
.scaledToFill()
VStack(alignment: .leading, spacing: 0) {
Text("Text")
OtherView()
}
}
}
}
编辑:我认为我面临的主要问题是如何动态调整HStack
内部的每个MyView
如果我希望MyView
中的Image
的大小能够填充其宽度,并垂直增长以保持其纵横比,然后RootView
中的每个MyView
的大小也能够达到RootView
宽度的40%,那么实现这一点的最佳方法是什么?我尝试过使用GeometryReader
,但是当它嵌套在滚动视图中时,它会导致它所使用的视图本身崩溃。如果我在滚动视图
之外使用它,我实际上总是会得到屏幕宽度(在这个应用程序中),这并不总是我需要的。最重要的是,假设MyView
嵌套在视图层次结构的更深处,并且不是直接从RootView
调用,而是从它的一个子视图调用。或者更好的是,假设我们不知道RootView
不知道它在运行时确定视图时呈现MyView
为了给任何对背景故事感兴趣的人一点背景知识,我正在尝试构建的应用程序本质上是非常模块化的。其思想是,我们实际上只有一个“容器视图”结构,用于确定在运行时渲染哪些视图。我们基本上在这个容器视图中有一个ScrollView
,然后是任意数量的子视图。我真的很难理解为什么相对于其父视图设置视图的内容维度如此困难,任何帮助都将不胜感激。我能想到的最好方法是使用GeometryReader
视图。这里有一个例子
GeometryReader { geometry in
RoundedRect(cornerRadius: 5).frame(width: geometry.size.width * 0.8, height: geometry.size.height * 0.8)
}
通常,我使用GeometryReader作为“根”视图并缩放其上的所有内容,但是您可以将其放置在另一个视图中,甚至可以将其作为覆盖以获取父视图的大小。比如说
VStack {
GeometryReader { geometry in
//Do something with geometry here.
}
}
如果我正确理解了您的目标,那么只需要使图像的大小可调整(考虑到纵横比,使其填充可用空间),如
VStack(对齐:前导,间距:24){
图像(“我的图像”)
.resizeable()//使用GeometryReader会得到什么结果?是否使用.padding()
在使用它时是否恰当?在滚动视图中使用GeometryReader
的结果是视图基本上自行折叠,从我的阅读来看,这似乎对ScrollView
和GeometryReader
的大小调整工作有意义。谢谢你的回答。这实际上是我的回答糟糕,我正在使用.resizeable()
在我的实际代码中,但只是忘了将其包含在示例中。我现在已对其进行了更新。但是,关于您的答案,我在视图中看到了一些问题,我希望图像占用其可用空间,如果图像过大,则图像会超出VStack的边界。不确定原因,但手动将帧设置为类似于UIScreen.main.bounds.width的东西修复了它(假设我想要全屏宽度),但我不喜欢这个解决方案,原因很明显。谢谢你的回答。正如我在问题中提到的,我已经尝试过使用GeometryReader
。问题是,当它在ScrollView
中使用时,事情开始不太好,因为ScrollView
的大小取决于它的内容和GeometryAreader
正在寻找ScrollView
的框架,这基本上会导致该视图中的所有内容都自行折叠。我曾考虑在根目录中使用GeometryReader
,并以某种方式将代理对象传递给子对象,但这只有在我始终想要相对于屏幕宽度a调整大小时才有效没有任何给定的视图
VStack(alignment: .leading, spacing: 24) {
Image("myImage")
.resizable() // << here !!
.aspectRatio(contentMode: .fill)