介紹
一個(gè)應(yīng)用在屏幕上顯示多個(gè)窗口,而這些窗口必須可以被管理還有能相互合作。window對象是在屏幕最上層的window響應(yīng)的。window最重要的兩個(gè)功能就是:(1)提供一個(gè)區(qū)域給去放置views (2)可以通過鍵盤或者鼠標(biāo)傳送用戶的動作分發(fā)或者接受事件。在使用中的window有時(shí)候飲用APPlication Kit的類,有時(shí)候引用window服務(wù)者的設(shè)備,意味著嘗試把上下文清空。Panels是一種特殊類型的window,提供一種特別的輔助功能,就好像實(shí)用的windows。
windows是怎么工作的
NSWindow類是定義一些實(shí)例對象去管理和協(xié)調(diào)一個(gè)應(yīng)用的windows顯示在屏幕上。AppKit也還定義了一個(gè)抽象的NSWindow子類-NSPanel——添加更多合適的動作給輔助的windwo。
一個(gè)NSWindow實(shí)例被定義為圍繞整個(gè)窗口的一個(gè)長方形的邊框,包括它的標(biāo)題欄,還有外圍的組件(例如:調(diào)整大小的控制器 ),還有一個(gè)包圍內(nèi)容的長方形內(nèi)容框。在屏幕坐標(biāo)系中,兩個(gè)長方形都是特殊定義的,并且都是整形的數(shù)值。長方形的邊框是建立在windwo的基礎(chǔ)坐標(biāo)系中。這個(gè)坐標(biāo)系通常在直線上增長并且在同一個(gè)坐標(biāo)系中衡量(換句話說,基礎(chǔ)的坐標(biāo)系是不能旋轉(zhuǎn)或者放大的)?;A(chǔ)坐標(biāo)系的原點(diǎn)實(shí)在窗口長方形邊框的左下角。
需要注意的是,你使用Xib創(chuàng)建windows,會允許你去擺放他們的位置,設(shè)置很多關(guān)于它們的屬性,還有布局。你用代碼去創(chuàng)建windows跟多的時(shí)候是包括把它們拿進(jìn)拿出屏幕;動態(tài)改變屬性,就好像標(biāo)題欄;運(yùn)行模態(tài)的windows去限制用戶的輸入;分配一個(gè)delegate去準(zhǔn)確監(jiān)控window的動作,比如說關(guān)閉,移動,改變大小。
通常你可以用代碼創(chuàng)建一個(gè)窗口,用規(guī)定的初始化方法,還有其它的屬性,大小,在內(nèi)容邊框的位置。長方形的邊框是衍生于二位的長方形內(nèi)容。
當(dāng)一個(gè)window被創(chuàng)建了,他會自動創(chuàng)建兩個(gè)view,一個(gè)不透明的有邊框的view,填充了長方形邊框區(qū)域,繪制了邊界的,有標(biāo)題欄,其它外圍的組建,還有背景,還有一個(gè)透明的內(nèi)容view,用長方形內(nèi)容填充。邊框的view還有它的外圍組件都是私有的類,你的應(yīng)用程序是不能直接訪問的。內(nèi)容view是window能訪問到最高層次的圖層,你可以用一個(gè)你自己創(chuàng)建的view用setContentView:的方法代替了內(nèi)容view。window決定了放置什么在內(nèi)容view。你不能用開始用NSView的setFrame:方法去放置它,你必須使用NSWindow類的放置方法。
你把其他的view作為window的內(nèi)容view 的子view或者內(nèi)容view的子view的子view,還有等等等,通過NSView的addSubView方法添加。這些view的樹形結(jié)構(gòu)稱為window的視圖層次。當(dāng)一個(gè)window被告知需要顯示它自己的時(shí)候,它通過發(fā)送display消息去在它圖層層次最高層次的view去實(shí)現(xiàn)這個(gè)動作。因?yàn)轱@示在確定的順序進(jìn)行,內(nèi)容視圖(這是先繪制)可以由它的子視圖的全部或部分遮擋,而這些子視圖的子視圖可以遮蔽(等等)。
一個(gè)窗口是怎么顯示的
通過它的view對象繪制實(shí)現(xiàn)顯示一個(gè)NSWindow的類,積累著window的顯示緩存或者立刻顯示在屏幕上。像NSView對象,可以無條件或僅顯示標(biāo)記為需要顯示,使用顯示和setviewsneeddisplay方法,分別為。一個(gè)displayifneeded信息使窗口的看法只有他們被標(biāo)記為需要顯示。通常情況下,任何時(shí)間視圖被標(biāo)記為需要顯示時(shí),窗口會注意到這個(gè)事實(shí),并自動顯示在其后不久。這種自動顯示通常是在每一個(gè)經(jīng)過的事件循環(huán),但可以關(guān)閉使用setautodisplay:方法。如果你關(guān)閉一個(gè)窗口澳地?cái)?shù)顯,你則負(fù)責(zé)顯示它在必要的時(shí)候。
一個(gè)窗口的視圖可以同時(shí)繪制。你可以使用的方法allowsconcurrentviewdrawing和setallowsconcurrentviewdrawing:確定和設(shè)置,分別,是否一個(gè)窗口繪制其觀點(diǎn)的同時(shí)。默認(rèn)情況下,一個(gè)窗口的視圖被同時(shí)繪制。
通過事件循環(huán)每一通,應(yīng)用對象調(diào)用其updatewindows方法,發(fā)送更新消息的每一個(gè)窗口。子類可以重寫此方法以NSWindow檢查應(yīng)用程序的狀態(tài)和改變自己的狀態(tài)或出現(xiàn)相應(yīng)地啟用或禁用菜單,按鈕,和基于對象的選定的其他控件,例如,除了在屏幕上顯示自己,一個(gè)窗口可以打印自己的全部,只是作為一個(gè)視圖可以。print:方法運(yùn)行該應(yīng)用程序的打印面板,并導(dǎo)致窗口的框架視圖打印自己。datawithepsinsiderect:同樣的行為。對于其他信息,請參閱打印編程指南。
模態(tài)窗口是怎么工作的
你可以使用整個(gè)window或者嵌套運(yùn)行在application-modal模式。使用當(dāng)前應(yīng)用程序的普通進(jìn)程但會限制輸入到窗口或者嵌套窗口。模態(tài)操作對于窗口或者嵌套窗口需要吸引用戶注意的時(shí)候來說是非常有用的。例如包括顯示錯(cuò)誤消息,或者警告,還有就是需要輸入的操作。例如打開一個(gè)對話,或者需要應(yīng)用在多窗口的對話。
這里有兩個(gè)機(jī)械裝置去操作一個(gè)模態(tài)的窗口或者嵌套窗口。第一,最簡單的就是調(diào)用NSApplication里面的runModalForWindow:方法,這個(gè)方法完全壟斷了時(shí)間傳遞,出了當(dāng)前這個(gè)特殊的窗口,或者直到stopModal,abortModal,stopModalWithCode其中一個(gè)方法被調(diào)用,一般情況都是通過按鈕的動作去響應(yīng)的。stopModal方法在進(jìn)程里面結(jié)束窗口或者嵌套窗口的模態(tài)狀態(tài)。它不會在一個(gè)定時(shí)器結(jié)束后觸發(fā)的動作或者一個(gè)分發(fā)的類里面起作用,因?yàn)檫@些機(jī)械的裝置都在事件進(jìn)程的外部。為了終止這些模態(tài)的進(jìn)程,你可以使用abortModal。這stopModal方法一般情況下在用戶點(diǎn)擊Ok按鈕的時(shí)候調(diào)用,abortModal當(dāng)用戶去點(diǎn)擊Cancel按鈕的稅后被調(diào)用。這兩種方法等效于stopModalWithCode:使用合適的表達(dá)式。
注意:您可以為一個(gè)視圖對象編寫一個(gè)模態(tài)事件循環(huán),這樣對象就可以訪問與特定任務(wù)相關(guān)的所有事件,比如在視圖中跟蹤鼠標(biāo)。例如,在創(chuàng)建自定義視圖時(shí)看到“響應(yīng)用戶事件和行為”。
普通的模態(tài)窗口的行為是拒絕其他窗口或者嵌套窗口去接受事件響應(yīng)。