Responsive design 如何为不同的方向返回不同的视图?

Responsive design 如何为不同的方向返回不同的视图?,responsive-design,swiftui,Responsive Design,Swiftui,我有一个视图,它是另外两个视图的VStack,仅此而已 这在纵向(或高大/瘦小的macOS窗口)中非常有效,但它会被压扁、笨拙,并且某些部分在横向(或宽/短的macOS窗口)中不可用 如何使此视图在纵向/高/瘦时返回VStack,而在横向/宽/短时返回HStack 我尝试了很多方法,但都导致编译器出错。由于SwiftUI是如此的新,我在网上找不到任何关于它的信息。你可以对环境做出反应。例如,如果要对horizontalSizeClass(常规vs紧凑)做出反应: struct MyView:Vi

我有一个视图,它是另外两个视图的
VStack
,仅此而已

这在纵向(或高大/瘦小的macOS窗口)中非常有效,但它会被压扁、笨拙,并且某些部分在横向(或宽/短的macOS窗口)中不可用

如何使此视图在纵向/高/瘦时返回
VStack
,而在横向/宽/短时返回
HStack


我尝试了很多方法,但都导致编译器出错。由于SwiftUI是如此的新,我在网上找不到任何关于它的信息。

你可以对环境做出反应。例如,如果要对horizontalSizeClass(常规vs紧凑)做出反应:

struct MyView:View{
@环境(\.horizontalSizeClass)变量horizontalSizeClass:UserInterfaceSizeClass
var body:一些观点{
团体{
如果horizontalSizeClass==.regular{
HStack{
文本(“A”)
文本(“B”)
}
}else{//compact
VStack{
文本(“A”)
文本(“B”)
}
}
}.边框(颜色.红色)
}
}

我使用GeometryReader解决了这个问题,并比较了宽度和高度。如果宽度>高度,则设备处于横向模式,否则处于纵向模式:

struct MyView: View {
    var body: some View {
        return GeometryReader { proxy in
            if proxy.size.width < proxy.size.height {
                VStack {
                    ...
                }
            } else {
                HStack {
                    ...
                }
            }
        }
    }
}
struct MyView:View{
var body:一些观点{
返回GeometryReader{proxy in
如果proxy.size.width
这只是给出了一个错误“包含控制流语句的闭包不能与function builder‘ViewBuilder’一起使用”。您可以在SwiftUI视图正文中编写的内容受到ViewBuilder的限制。不能使用任何控制流语句。事实上,当你使用“如果”时,你没有使用完整的swift if。不幸的是,编译器并不总是太清楚它。对于其他情况,则是如此。例如,如果您尝试放置以下内容:
如果让x=3,horizontalSizeClass==.regular
,编译器将更清楚:包含控制流语句的闭包不能与带开关的函数生成器“ViewBuilder”一起使用,它更类似。底线是,您不能使用它:-(我看到你删除了以前的评论并替换了它。当你说它不起作用时。你指的是我发布的答案吗?我明白了…我很抱歉评论编辑/删除混乱。我对编译器感到非常奇怪,不太知道该说什么。整个SwiftUI需要很多成熟度;它只是充满了例外。)谢谢你的帮助!请注意,被接受的答案在iPad上是不起作用的。所有iPad在所有方向上都会有一个固定的尺寸等级。它们只有在分屏时才会有紧凑的尺寸。谢谢你,@dfd。如果你有更好的答案,请在这里发布。#1.我非常肯定我一直觉得这是使用大小类的一个弱点。我最好的
UIKit
答案-我一直使用这个答案,因为我的图像编辑应用程序需要强调“图像”是将编辑控件放置在纵向图像的下方和横向图像的右侧。我有一组扩展到
UIView
snd
UIViewController
,这些扩展取决于它们的生命周期,并测量屏幕的高度/宽度,这是我仅用iPad
SwiftuUI
应用程序无法做到的n、 #2.我真的不喜欢这款应用在我的iPad mini上的外观,但我已经接受了这是一个人在前沿工作所付出的代价。就像你需要如何使用
UIImage
(或者
CIImage及其
extent`属性)为了得到图像大小中的点数(而不是像素),我希望苹果有一天会纠正这一点。我只是想让你知道,使用大小类的“差距”是存在的。我把这作为我公认的答案,因为经过多次测试,这也是我使用的解决方案