基于文档的 MacOs 应用程序的 SwiftUI 窗口大小
Posted
技术标签:
【中文标题】基于文档的 MacOs 应用程序的 SwiftUI 窗口大小【英文标题】:SwiftUI window size for document based MacOs App 【发布时间】:2020-07-29 11:59:33 【问题描述】:我正在将我的应用程序从 SwiftUI xCode 11 移动到 xCode 12 中新的基于文档的应用程序生命周期格式。我无法弄清楚如何设置窗口大小。在 Xcode 11 中我有
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 1200, height: 800),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
如何在没有 AppDelegate 的情况下达到同样的效果?
【问题讨论】:
【参考方案1】:试试下面的(因为窗口默认有.fullSizeContentView)
var body: some Scene
WindowGroup
ContentView()
.frame(width: 1200, height: 800) // << here !!
.frame(minWidth: 800, maxWidth: .infinity,
minHeight: 600, maxHeight: .infinity)
【讨论】:
这行得通,但它使窗口保持固定大小并且无法调整大小,这在旧方法中是可能的。我曾尝试使用具有相同数字的“idealSize”,但我最终得到了一个较小的窗口,我总是需要调整它的大小。如果我尝试 (maxWidth: .infinity, maxHeight: .infinity) 我也会得到一个更小的窗口。在所有情况下,应用程序都会最小化。我假设“styleMask”包含缺失的部分? 好的,这有帮助!!!使用双 .frame 语句,窗口也可以调整大小。由于某种原因,仍然出现最小化。因此,如果有人对此有解决方案,我很乐意听到,但我现在将问题标记为已回答。谢谢! 不幸的是,这不适用于 Catalyst。有什么想法吗? 这在 Bug Sur 11.2.3 中用于设置窗口大小,但如果我调整窗口大小,它会移动子视图,而不是调整它们的大小。也就是说,左侧的 List 视图被推离窗口边界的左边缘。似乎是一个错误,我已经报告了。【参考方案2】:我使用了换出最小尺寸的技巧。不优雅,但解决了问题。
struct ContentView: View
@ObservedObject var document: MyDocument
@State var minSize:CGSize =
// Set your preferred initial size here
guard let screen = NSScreen.main?.frame.size
else return CGSize(width: 800, height: 600)
return CGSize(width: screen.width * 0.75, height: screen.height * 0.75)
()
var body: some View
VStack
Text("Content")
.frame(minWidth: minSize.width, minHeight: minSize.height)
.onAppear
Task
await Task.sleep(500_000_000)
// Set your real min size here
minSize = CGSize(width: 600, height: 400)
希望下一个 SwiftUI 能有正常的方式。
【讨论】:
以上是关于基于文档的 MacOs 应用程序的 SwiftUI 窗口大小的主要内容,如果未能解决你的问题,请参考以下文章
使用 SwiftUI 在 MacOS 中的多列 TableViews