NSWindow(窗口對象)

一.NSWindow

  • NSWindow窗口是應(yīng)用UI界面視圖的容器,它負(fù)責(zé)接收用戶的鼠標(biāo)鍵盤等系統(tǒng)事件,轉(zhuǎn)發(fā)消息到相關(guān)的接收者對象。AppKit提供的一些子類化的窗口還可以實現(xiàn)一些輔助交互功能,比如文件打開保存的對話框,字體顏色選擇器等等。
  • 每個應(yīng)用啟動后至少會打開一個窗口。當(dāng)你運(yùn)行多個應(yīng)用App時,屏幕上會有多個窗口界面。我們把當(dāng)前用戶正在工作的應(yīng)用的窗口稱為活動或激活的窗口,其他應(yīng)用的窗口相應(yīng)的稱為非活動的窗口?;顒哟翱陧敳康膖itle bar部分的顏色是高亮灰色選中狀態(tài)。

KeyWindow
可以接收輸入事件(鍵盤,鼠標(biāo),觸控板等外設(shè))的窗口對象稱為ZkeyWindowZ;
MainWindow
當(dāng)前的
活動窗口也稱為mainWindow一個時刻只能有一個keyWindow和一個mainWindow。**


二.窗口界面的組成

窗口對象包括titleBar, contentView內(nèi)容視圖, contentBorder底部邊框區(qū)。titleBar上面包括控制按鈕、標(biāo)題,如下圖所示。



三.模態(tài)窗口

有些特殊場景需要限制用戶只能處理完當(dāng)前的窗口的任務(wù),完成任務(wù)后關(guān)閉它才能繼續(xù)操作其他的窗口,這種窗口稱為模態(tài)窗口(Modal Window)。
模態(tài)窗口分為兩種

  • 1.Modal Window

這種window比較霸道,當(dāng)它啟動后,此時只有這個window可以接收響應(yīng)用戶操作,無法切換到其他窗口操作,其他窗口也不能接收處理系統(tǒng)內(nèi)部的各種事件

使用NSApplication的runModal方法來創(chuàng)建Modal window

@IBAction func showModalWindow(_ sender: NSButton) {
    NSApplication.shared.runModal(for: modalWindow)
    modalWindow.center()
}

使用stopModal方法來結(jié)束模態(tài).如果用戶直接點(diǎn)擊了窗口頂部最左側(cè)的關(guān)閉按鈕,窗口關(guān)閉了,但是整個應(yīng)用仍然處于模態(tài),任何操作都無法得到響應(yīng).正確的做法是監(jiān)聽窗口關(guān)閉事件,增加結(jié)束模態(tài)的方法調(diào)用.

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Insert code here to initialize your application
    NotificationCenter.default.addObserver(self, selector:#selector(self.windowClose(_:)),  name: NSWindow.willCloseNotification, object: nil)
}

@objc func windowClose(_ aNotification: Notification){
    NSApplication.shared.stopModal()
}
  • 2.Modal Session

比起Modal windows,Modal sessions方式創(chuàng)建的window稍微溫和一些,允許響應(yīng)快捷鍵和系統(tǒng)菜單,比如字體顏色選擇這些panel面板.

@IBAction func showSessionsWindow(_ sender: NSButton) {
    sessionCode = NSApplication.shared.beginModalSession(for: self.modalWindow)
}

結(jié)束Modal sessions窗口,使用sessionCode做為參數(shù)來關(guān)閉Modal sessions窗口.跟上面的模態(tài)處理一樣需要注冊窗口關(guān)閉事件來正常執(zhí)行模態(tài)狀態(tài)關(guān)閉.

@objc func windowClose(_ aNotification: Notification){
    
    if let sessionCode = sessionCode {
        NSApplication.shared.endModalSession(sessionCode)
        self.sessionCode = nil
    }
}

四.創(chuàng)建窗口

使用NSWindow類創(chuàng)建窗口對象,除了frame參數(shù),還需要制定styleMask來確定窗口樣式風(fēng)格.

func createWindow() {
    let frame = CGRect(x: 0, y: 0, width: 400, height: 280)
    let style : NSWindow.StyleMask = [NSWindow.StyleMask.titled,NSWindow.StyleMask.closable,NSWindow.StyleMask.resizable]
    //創(chuàng)建window
    myWindow = NSWindow(contentRect:frame, styleMask:style, backing:.buffered, defer:false)
    myWindow.title = "New Create Window"
    //顯示window
    myWindow.makeKeyAndOrderFront(self);
    //居中
    myWindow.center()
}

1. styleMask:表示窗口風(fēng)格的參數(shù)

  • borderless:沒有項部標(biāo)題欄和控制按鈕。
  • titled: 有頂部標(biāo)題欄邊框。
  • closable: 帶有關(guān)閉按鈕。
  • miniaturizable:帶有最小化按鈕。
  • resizable:帶有恢復(fù)按鈕。
  • texturedBackground:帶紋理背景窗口。
  • uitTitlAndToobarar窗口的標(biāo)題欄按鈕區(qū)和窗口頂部的標(biāo)題區(qū)融合為一體。
  • fullScreen:全屏顯示。
  • fullSizeContentView:內(nèi)容視圖占據(jù)整個窗口大小。
  • utilityWindow: NSPanel 類型的窗口。
  • docModalWindow:模態(tài)文檔,NSPanel 類型窗口。
  • nonactivatingPanel:一種非活動主應(yīng)用NSPanel類型窗口,點(diǎn)擊這種面板不會導(dǎo)致主應(yīng)用窗口從活動狀態(tài)變?yōu)榉腔顒訝顟B(tài).
  • hudWindow: HUD黑色風(fēng)格窗口,只有NSPanel類型窗口支持.

2. backing: 窗口繪制的緩存模式

  • retained: 兼容老系統(tǒng)參數(shù),基本很少用到.
  • nonretained: 不緩存直接繪制.
  • buffered: 緩存繪制.

五. 窗口通知

當(dāng)窗口狀態(tài)變化時候,系統(tǒng)會發(fā)出相關(guān)通知消息.下面是一些典型的窗口通知事件,更多通知事件請參考NSWindow類文件中的定義.

  • NSWindowDidBecomeKeyNotification:窗口成為keyWindow
  • NSWindowDidBecomeMainNotification:窗口成為mainWindow
  • NSWindowDidMoveNotification:窗口移動
  • NSWindowDidResignKeyNotification:窗口不再是keyWindow
  • NSWindowDidResignMainNotification:窗口不再是mai nWindow
  • NSWindowDidResizeNotification:窗口大小改變
  • NSWindowWillCloseNotification:關(guān)閉窗口
  • NSWindowDidMiniaturizeNotification:窗口最小化

六.窗口內(nèi)容(ContentView)

open var contentView: NSView?

@available(OSX 10.10, *)
open var contentViewController: NSViewController?

1.可以使用自定義的NSView或NSViewController的view,添加到contentView

self.window.contentView?.addSubview(myView)

2.macOS 10.10系統(tǒng)及以上,創(chuàng)建一個NSViewController的子類,實例化后賦值給NSWindow的contentViewController.

self.window.contentViewController = myViewController

七.窗口的創(chuàng)建和管理

  • 般情況下很少需要單獨(dú)創(chuàng)建和管理窗口NSWindow對象.NSWindow的創(chuàng)建都是基于項目場景模版創(chuàng)建,或者通過NSWindowController創(chuàng)建管理的.
  • 新建一個項目,工程中會自動生成的MainMenu.xib中會包含一個Window對象,這個Window是由AppDelegate管理的.
  • 新建一個項目,勾選Create Document-Based Application,自動生成的Document.xib會包含一個Window對象,這個Window是由NSDocument文檔類來管理的.
  • 新建一個NSWindowCotrller的子類WindowContoller,勾選使用xib, 自動生成的WindowController.xib會包含一個Window對象.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容