OSX应用程序:如何使窗口最大化?

时间:2015-12-16 14:37:18

标签: swift macos cocoa nswindow

我正在开发一个mac应用程序,我喜欢让初始窗口处于最大化状态,就像你按下带加号的绿色按钮一样。 我不希望它是全屏的。

6 个答案:

答案 0 :(得分:9)

处于缩放状态的应用与“最大化”不同。绿色加号图标表示缩放,表示“此内容的适当大小”。在某些应用程序中,这是可见的框架(正如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英寸显示器上也可能非常强大)。有时这很好,取决于你的应用程序,但我经常发现值得定义一个最大的初始大小(同时允许用户使其更大)。

答案 1 :(得分:7)

你可以"缩放"使用NSScreen的visibleFrame作为目标框架,指向最大可用空间的窗口。让我们说window是您的NSWindow IBOutlet:

if let screen = NSScreen.mainScreen() {
    window.setFrame(screen.visibleFrame, display: true, animate: true)
}

例如,在AppDelegate.swift中:

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)
        }
    }

答案 2 :(得分:1)

在Swift 4.2中:

class ViewController: NSViewController {
 override func viewDidAppear() {
    super.viewDidAppear()
    view.window?.zoom(self) //bespread the screen

  //view.window?.toggleFullScreen(self)  //fullscreen
}

答案 3 :(得分:1)

2020年| SWIFT 5.1:

使用扩展名:

extension NSWindowController {
    func maximize() {
        self.window?.zoom(self)
    }
}

只需调用NSWindowController实例的maximize()即可:)

答案 4 :(得分:1)

雨燕5

如果仍然有问题,请尝试将zoom函数调用为主线程。为我工作。

 DispatchQueue.main.async {
     self.view.window?.zoom(self)
 }

答案 5 :(得分:0)

嗨,大家好,非常感谢你的帮助。

我正在开发基于文档的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)
        }
    }