质疑SwiftUI中间隔器的动态性

质疑SwiftUI中间隔器的动态性,swiftui,Swiftui,我从多个地方听说间隔器是动态的/相对于不同的屏幕尺寸。我一直把它们作为我布局的重要组成部分,但它们让我失望。有人能告诉我我是否用错了吗?这是一个矩形的例子,矩形上有一个方格。由于矩形开始时很大,我还需要将其向下推到屏幕上,所以我使用了很多间隔符(这似乎是不必要的)。我试过使用填充物,但它并没有像我需要的那样向下推。在我提供的代码之后,您将看到两张图片。一款是iPodtouch(第7代),另一款是iPhone12Pro Max。所有设备的布局都不匹配。我的目标是让这两款设备都具有iPod touc

我从多个地方听说间隔器是动态的/相对于不同的屏幕尺寸。我一直把它们作为我布局的重要组成部分,但它们让我失望。有人能告诉我我是否用错了吗?这是一个矩形的例子,矩形上有一个方格。由于矩形开始时很大,我还需要将其向下推到屏幕上,所以我使用了很多间隔符(这似乎是不必要的)。我试过使用填充物,但它并没有像我需要的那样向下推。在我提供的代码之后,您将看到两张图片。一款是iPodtouch(第7代),另一款是iPhone12Pro Max。所有设备的布局都不匹配。我的目标是让这两款设备都具有iPod touch的布局

ZStack {
        VStack {
            ForEach(1..<38)  { _ in
                Spacer()
            }
            Rectangle()
                .fill(Color.blue)
        }
        VStack {
            Spacer()
            Spacer()

            HStack {
                Rectangle()
                    .scaledToFit()
                Rectangle()
                    .scaledToFit()
                Rectangle()
                    .scaledToFit()
                Rectangle()
                    .scaledToFit()
                Rectangle()
                    .scaledToFit()
            }

            Spacer()
        }
    }
ZStack{
VStack{

ForEach(1..您不应该需要多个
Spacer()

GeometryReader{geometry中的几何体
VStack{
垫片()
VStack{
HStack{

ForEach(0..您不应该需要多个
Spacer()

GeometryReader{geometry中的几何体
VStack{
垫片()
VStack{
HStack{

ForEach(0..您的问题并不清楚您希望布局是什么样子。因此,此代码基于我对您的问题的推测,我不太理解

导入快捷界面
结构布局视图:视图{
var body:一些观点{
ZStack{
VStack{
矩形().填充(颜色.白色)
ZStack{
矩形().填充(颜色.蓝色)
VStack{
HStack{
矩形()
矩形()
矩形()
矩形()
矩形()
}
.偏移量(x:0,y:50)
垫片()
}
}
}
}
}
}
结构布局视图\u预览:预览提供程序{
静态var预览:一些视图{
布局视图()
.previewDevice(.some(.init(原始值:“iPhone 12 Pro Max”))
布局视图()
.previewDevice(.some(.init(原始值:“iPod touch(第七代)”))
}
}

您的问题并不清楚您希望布局是什么样的。因此,此代码基于我对您的问题的推测,我不太理解

导入快捷界面
结构布局视图:视图{
var body:一些观点{
ZStack{
VStack{
矩形().填充(颜色.白色)
ZStack{
矩形().填充(颜色.蓝色)
VStack{
HStack{
矩形()
矩形()
矩形()
矩形()
矩形()
}
.偏移量(x:0,y:50)
垫片()
}
}
}
}
}
}
结构布局视图\u预览:预览提供程序{
静态var预览:一些视图{
布局视图()
.previewDevice(.some(.init(原始值:“iPhone 12 Pro Max”))
布局视图()
.previewDevice(.some(.init(原始值:“iPod touch(第七代)”))
}
}

谢谢你的回答,我将正确地标记这个问题,因为这是第一个给出的问题,我喜欢它使用的方法,但这两个问题都达到了预期的效果。但我也想知道为什么我使用的不起作用。我只使用了与屏幕大小相关的间隔符,所以看起来会是这样。你有没有你知道为什么没有吗?当我说“往那边走”我的意思是为什么它在两个屏幕上没有相同的结果。@Chr0mePl8edSt0vePipe您在
ZStack
中有两个
VStack
重叠在一起,并且有不同的布局,在不同的屏幕大小上也可能不同。
间隔符
会根据屏幕大小来腾出空间。好的,谢谢,我想我现在明白了。谢谢对于答案,我要把这个问题标记正确,因为这是第一个给出的问题,我喜欢它使用的方法,但这两个问题都达到了预期的效果。但我也想知道为什么我使用的不起作用。我只使用了与屏幕大小相关的间隔符,所以看起来会是这样。你知道为什么吗不是吗?当我说“往那边走”我的意思是为什么它在两个屏幕上没有相同的结果。@Chr0mePl8edSt0vePipe您在
ZStack
中有两个
VStack
重叠在一起,并且有不同的布局,在不同的屏幕大小上也可能不同。
间隔符
会根据屏幕大小来腾出空间。好的,谢谢,我想我现在明白了。谢谢对于答案。我将上面的答案标记为正确,因为两个答案都达到了预期目标(抱歉,没有说得太清楚),并且因为另一个答案是先给出的,我只是更喜欢上面的代码。我还认为@andykkt的答案更好。
。padding(.vertical)
可能更有用。谢谢你的回答。我把上面的答案标对了,因为两个答案都达到了预期的目标(很抱歉没有说得太清楚),而且另一个答案是先给出的,我只是更喜欢上面的代码。我也认为@andykkt的答案更好。
.padding(.vertical)
可能更有用。
GeometryReader { geometry in
    VStack {
        Spacer()
        
        VStack {
            HStack {
                ForEach(0..<5) {_ in
                    Rectangle()
                        .scaledToFit()
                }
            }
            .padding(.vertical)
            
            Spacer()
        }
        .background(Color.blue)
        .frame(height: geometry.size.height * 0.4)
    }
}