我正在开发一款Mac应用程序,并希望初始窗口处于最大化状态,就像按下带加号的绿色按钮时一样。但我不想让它成为全屏模式。
在缩放状态下的应用程序与“最大化”不是同一件事情。绿色加号图标表示缩放,意思是“适合此内容的适当大小”。在某些应用程序中,它是可见框架(如Eric D.所讨论的),但几乎可以是任何东西。例如,尝试缩放 Safari 窗口。
假设您真的想要“最大化”,而不是“缩放”,那么 Eric 是正确的轨道,但是有更好的方法可以实现。首先,如果窗口有屏幕,则应使用窗口的屏幕。另外,在启动期间不应动画窗口调整大小(因为这可能在启动时显得笨拙)。
func applicationDidFinishLaunching(aNotification: NSNotification) {
if let screen = window.screen ?? NSScreen.mainScreen() {
window.setFrame(screen.visibleFrame, display: true)
}
}
你可以考虑使用NSWindowController
来管理这个问题,而不是把它放在应用程序代理中。在这种情况下,您可以将此放在windowDidLoad
中。窗口控制器是AppKit中非常常见的工具(与视图控制器相反,后者历史上并不常见)。
如果您需要缩放行为,请熟悉NSWindowDelegate
方法windowWillUseStandardFrame(_:defaultFrame:)
。通常不应直接在启动时调用zoom(_:)
,因为那样会产生动画效果,但您在委托中进行的任何逻辑都应该用于计算帧。同样,请确保将框架调整为生活在窗口的屏幕上(如果有的话),而不是主屏幕上。
理想情况下,您真正应该尊重用户使用的最后一帧,而不是强制它成为可见帧。如果您想进一步了解,请查看Cocoa中的frameAutosave
。如果您只是在Interface Builder中设置自动保存名称,窗口控制器将帮助您自动管理它。(尽管需要在第一次启动时计算帧以获得可见帧,所以它不会完全自动。)
在任何情况下,在将默认帧设置为可见帧之前,请仔细考虑一下。这可能在大型监视器上非常庞大(仍然有很多30英寸的Cinema显示器,但即使在27英寸上也可能会非常压倒性)。根据您的应用程序,有时这是可以接受的,但我经常发现,值得定义最大的初始大小(同时允许用户使其变得更大)。
您可以使用NSScreen的visibleFrame
作为目标框架,将窗口“缩放”到最大可用空间。假设window
是您的NSWindow IBOutlet:
if let screen = NSScreen.mainScreen() {
window.setFrame(screen.visibleFrame, display: true, animate: true)
}
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
func applicationDidFinishLaunching(aNotification: NSNotification) {
if let screen = NSScreen.mainScreen() {
window.setFrame(screen.visibleFrame, display: true, animate: true)
}
}
.mainScreen()
替换为 .main()
即可。 - Eric Ayawindow.screen
。 - Avishay Cohen在Swift 4.2中:
class ViewController: NSViewController {
override func viewDidAppear() {
super.viewDidAppear()
view.window?.zoom(self) //bespread the screen
//view.window?.toggleFullScreen(self) //fullscreen
}
2020 | SWIFT 5.1:
使用扩展(extension):
extension NSWindowController {
func maximize() { self.window?.zoom(self) }
}
只需调用 NSWindowController 实例的 maximize()
方法即可 :)
Swift 5
如果仍然存在问题,请尝试在主线程调用缩放功能。这对我起到了作用。
DispatchQueue.main.async {
self.view.window?.zoom(self)
}
大家好,非常感谢你们的帮助。
我正在开发一个基于文档的 Mac 应用程序。我将您提供的代码放在 Document 类的 makeWindowControllers() 中,它运行得非常好。
非常感谢你们。这是我使用的代码:
override func makeWindowControllers() {
// Returns the Storyboard that contains your Document window.
let storyboard = NSStoryboard(name: "Main", bundle: nil)
let windowController = storyboard.instantiateControllerWithIdentifier("Document Window Controller") as! NSWindowController
self.addWindowController(windowController)
if let screen = NSScreen.mainScreen() {
windowController.window?.setFrame(screen.visibleFrame, display: true, animate: true)
}
}
这段代码只适用于单窗口应用程序,但很容易修改以适用于多窗口应用程序。
最大化和取消最大化窗口的用法:
TheApp.maximized.toggle()
源代码
public class TheApp {
static var maximized: Bool {
get {
guard let visibleFrame = NSScreen.main?.visibleFrame,
let window = NSApp.mainWindow
else { return false }
return window.frame == visibleFrame
}
set { NSApp.mainWindow?.zoom(newValue) }
}
static var fullscreen: Bool {
get {
guard let screenFrame = NSScreen.main?.frame,
let window = NSApp.mainWindow
else { return false }
return window.frame == screenFrame
} set {
NSApp.mainWindow?.toggleFullScreen(newValue)
}
}
static var mimimized: Bool {
get { NSApp.mainWindow?.isMiniaturized ?? false }
set { NSApp?.mainWindow?.miniaturize(newValue) }
}
}