如何使 SwiftUI .sheet() 大小与 MacOS 上窗口的宽度/高度匹配?

时间:2021-02-15 22:53:49

标签: swiftui

背景

我正在 Catalina 上的 Xcode 12.4 中的 SwiftUI 中开发 MacOS 应用程序。现在我的应用有一个带有磁贴的登录页面,每个磁贴都包含一个使用表格显示的功能。

ForEach(MenuItem.allCases) { menuItem in
    Button(action: {
        detailView = menuItem
    }) {
        Tile(labelText: menuItem.menuText, icon: menuItem.menuIcon)
            .sheet(item: $detailView) { item in
                FeatureView(dismissFeatureView: { self.detailView = nil }, menuItem: item)
                    .environmentObject(container)
                    .background(Color("backgroundMain"))
            }
    }
}

窗口具有最小宽度和高度,但可以扩展,因为它没有最大高度或宽度。我正在寻找一种方法让工作表占据整个屏幕。在 iOS 上,您可以使用 .fullScreenCover(),但在 MacOS 上不可用。所以现在,当我放大屏幕并点击磁贴 the sheet view doesn't take up the entire space 时。

此外,用户可以将工作表的大小调整为超出窗口的大小,如 here 所示。

问题

如何使工作表视图与窗口的大小(没有最大宽度或高度)相匹配,以便用户仍然可以调整窗口大小,但要确保工作表始终占据整个窗口.

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用 GeometryReader 获取父视图的大小,并将其应用于工作表的框架。见下面的代码:

GeometryReader { geometry in
    VStack(alignment: .center) {
        HStack(alignment: .center, spacing: 20) {
            ForEach(MenuItem.allCases) { menuItem in
                Button(action: {
                    detailView = menuItem
                }) {
                    Tile(labelText: menuItem.menuText, icon: menuItem.menuIcon)
                        .sheet(item: $detailView) { item in
                            FeatureView(dismissFeatureView: { self.detailView = nil }, menuItem: item)
                                .environmentObject(container)
                                .background(Color("backgroundMain"))
                                .frame(width: geometry.size.width, height: geometry.size.height)
                        }

                }
            }
        }
    }
}