2015-12-16 66 views

回答

5

通過使用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) 
     } 
    } 
+0

對不起,我是非常新的mac世界。我只是把這個代碼放在NSViewController:viewDidLoad中,它不工作,你可以告訴我在哪裏準確地放置這段代碼。這是我的代碼,如果讓屏幕= NSScreen.mainScreen(){ self.view.window?.setFrame(screen.visibleFrame,display:true,animate:true) } –

+0

用示例更新我的答案。 – Moritz

+1

更新Swift 3:只需用'.main()'替換'.mainScreen()'。 – Moritz

6

在其放大狀態的應用程序是不一樣的東西「最大化」。綠色加號圖標表示縮放,意思是「適合此內容的尺寸」。在一些可見框架的應用程序中(如Eric D.所討論的),但它可以是幾乎任何東西。例如嘗試縮放Safari窗口。

假設你真的想要「最大化」而不是「縮放」,那麼埃裏克是在正確的軌道上,但它可以做得更好。首先,你應該使用窗口的屏幕,如果它有一個。此外,您不應該在啓動時調整窗口大小(因爲啓動時可能看起來很尷尬)。

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。如果您只是在界面生成器中設置自動保存名稱,窗口控制器將幫助您自動管理該功能。 (雖然稍微複雜一些,需要首次啓動時計算幀以獲取可見幀,因此它不會完全自動)。

在使默認幀成爲任何可見幀之前,請仔細考慮一下案件。在大型顯示器上這可能非常巨大(仍然有很多30英寸的Cinema顯示器,但即使在27英寸的顯示器上,它也可能非常令人難以置信)。有時根據您的應用程序,這很好,但我經常發現,定義最大初始大小是值得的(同時允許用戶使其更大)。

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) 
     } 
    } 
相關問題