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

15

我正在开发一款Mac应用程序,并希望初始窗口处于最大化状态,就像按下带加号的绿色按钮时一样。但我不想让它成为全屏模式。

7个回答

11

在缩放状态下的应用程序与“最大化”不是同一件事情。绿色加号图标表示缩放,意思是“适合此内容的适当大小”。在某些应用程序中,它是可见框架(如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英寸上也可能会非常压倒性)。根据您的应用程序,有时这是可以接受的,但我经常发现,值得定义最大的初始大小(同时允许用户使其变得更大)。


Rob - 不错。 - Fattie

8

您可以使用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)
        }
    }

抱歉,我在Mac世界中非常新手。我刚刚将这段代码放入NSViewController:viewDidLoad中,但它没有起作用,您能告诉我应该把这段代码放在哪里吗?这是我的代码:if let screen = NSScreen.mainScreen() { self.view.window?.setFrame(screen.visibleFrame, display: true, animate: true) } - Rashid Mousavy Khoshrou
1
更新了我的答案并附上了一个示例。 - Eric Aya
4
Swift 3 更新:只需将 .mainScreen() 替换为 .main() 即可。 - Eric Aya
这段代码可以使Windows全屏,但是在点击Esc键后,应用程序会崩溃。原因是什么? - VANILKA
它不一定要出现在主屏幕上,但是您可以使用 window.screen - Avishay Cohen

4

在Swift 4.2中:

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

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

3

2020 | SWIFT 5.1:

使用扩展(extension):

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

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


1

Swift 5

如果仍然存在问题,请尝试在主线程调用缩放功能。这对我起到了作用。

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

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

0

这段代码只适用于单窗口应用程序,但很容易修改以适用于多窗口应用程序。

最大化和取消最大化窗口的用法:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接