如何针对不同的方向返回不同的视图?

时间:2019-07-11 04:51:30

标签: responsive-design swiftui

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

这在纵向方向(或高/瘦的macOS窗口)中效果很好,但是它压扁,笨拙,并且某些部分在横向(或宽/短的macOS窗口)中不可用。

如何使该视图在人像/高/瘦的情况下返回VStack,而在风景/宽/短时返回HStack

我尝试了很多事情,但是都导致了编译器错误。由于SwiftUI太新了,所以我在网上找不到任何有关此的信息。

2 个答案:

答案 0 :(得分:3)

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

struct MyView: View {
    var body: some View {
        return GeometryReader { proxy in
            if proxy.size.width < proxy.size.height {
                VStack {
                    ...
                }
            } else {
                HStack {
                    ...
                }
            }
        }
    }
}

答案 1 :(得分:2)

您可以对环境做出反应。例如,如果您想对horizo​​ntalSizeClass(常规vs紧凑)做出反应:

struct MyView: View {
    @Environment(\.horizontalSizeClass) var horizontalSizeClass: UserInterfaceSizeClass

    var body: some View {
        Group {

            if horizontalSizeClass == .regular {
                HStack {
                    Text("A")
                    Text("B")
                }
            } else { // compact
                VStack {
                    Text("A")
                    Text("B")
                }

            }
        }.border(Color.red)
    }
}