我正在使用默认的SwiftUI应用程序模板制作一个MacOS应用程序。我如何将窗口的最小大小设置为(800, 500)?另外,如果我关闭窗口,然后重新打开,它会以上次关闭时的大小和位置重新打开。我如何使它不记得上次关闭时的窗口位置和大小?我使用的是Xcode 11.2.1和MacOS Catalina 。我如何做到这些?
(800, 500)
yhived7q1#
如果您从macOS SwiftUI模板创建项目,则您需要进行的所有更改都在AppDelegate. swift中。窗口的大小是由内容定义的,因此您需要指定根内容视图框架,并且要禁止保存窗口位置,您需要删除setFrameAutosaveName,因此您的AppDelegate应该如下所示
setFrameAutosaveName
@NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { var window: NSWindow! func applicationDidFinishLaunching(_ aNotification: Notification) { // Create the SwiftUI view that provides the window contents. let contentView = ContentView() .frame(minWidth: 800, maxWidth: .infinity, minHeight: 500, maxHeight: .infinity) // Create the window and set the content view. window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 800, height: 500), styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView], backing: .buffered, defer: false) window.center() window.contentView = NSHostingView(rootView: contentView) window.makeKeyAndOrderFront(nil) } ...
**更新:**SwiftUI生命周期方法相同-在窗口场景中将帧设置为内容视图,如
var body: some Scene { WindowGroup { ContentView() .frame(minWidth: 800, maxWidth: .infinity, minHeight: 500, maxHeight: .infinity) } }
dgsult0t2#
较新版本的Xcode(和模板)现在使用 SwiftUI App 生命周期,而不是 AppKit App Delegate。在这种情况下,您可以使用Layout.frame方法设置窗口大小(或任何SwiftUI视图的大小)来设置边界。就像使用任何修饰符一样:
VStack { Text("You are Logged In") Button(action: { self.loggedIn = false }, label: { Text("Logout") }) } .frame(minWidth: 400, idealWidth: 600, minHeight: 450, idealHeight: 800)
同样,这可以与任何SwiftUI视图一起使用,因此这是一种布局视图的方便方法。编辑:这个答案适用于所有平台,包括macOS。
2条答案
按热度按时间yhived7q1#
如果您从macOS SwiftUI模板创建项目,则您需要进行的所有更改都在AppDelegate. swift中。
窗口的大小是由内容定义的,因此您需要指定根内容视图框架,并且要禁止保存窗口位置,您需要删除
setFrameAutosaveName
,因此您的AppDelegate应该如下所示**更新:**SwiftUI生命周期方法相同-在窗口场景中将帧设置为内容视图,如
dgsult0t2#
较新版本的Xcode(和模板)现在使用 SwiftUI App 生命周期,而不是 AppKit App Delegate。在这种情况下,您可以使用Layout.frame方法设置窗口大小(或任何SwiftUI视图的大小)来设置边界。就像使用任何修饰符一样:
同样,这可以与任何SwiftUI视图一起使用,因此这是一种布局视图的方便方法。
编辑:这个答案适用于所有平台,包括macOS。