2013-01-12 41 views
-2

我想製作一個包含應用程序圖標的停靠欄。如果我點擊任何圖標,那麼該應用程序應該午餐,如何隱藏該停靠欄?製作停靠欄吧

我是新來的可可,我不知道它。 所以任何人都可以給我基本的想法。

在此先感謝

+1

IMO,你不應該試圖在第一個地方替換Dock。但是,如果你真的想要隱藏它,看看Kiosk模式 – CodaFi

+1

你是Cocoa的新手,你想立即替換關鍵系統UI功能之一嗎?允許我建議從頭開始。 Apple有許多[很好的教程](http://developer.apple.com/library/mac/#referencelibrary/GettingStarted/RoadMapOSX/chapters/01_Introduction.html%23//apple_ref/doc/uid/TP40012262),以及有幾本優秀的可可書可以閱讀:http://stackoverflow.com/questions/945600/book-recomend-for-learning-cocoa-programming –

+1

@Josiah:提問者確實說過「我對此毫不知情」。如果你不知道該怎麼去嘗試,你會嘗試什麼? –

回答

7

有幾個關鍵因素在這裏:

  • 像屏幕上的幾乎任何東西,你會碼頭必須在一個窗口。據推測,你並沒有想象一個帶有標準框架的窗口(標題欄,停車燈和調整大小手柄),所以你需要一個無邊框窗口。它必須在特定的window level,即this one
  • 每個圖標將是一個按鈕to start with。您可以將其發展爲能夠彈跳的自定義視圖,顯示運行狀態(如Dock與其LED一樣)等。
  • 該Dock使用三種類型填充自己:Running applications,書籤式應用程序在Dock中甚至在運行時),以及書籤文件(文檔,文件夾等)。應用程序位於分隔線的左側;書籤文件和垃圾箱位於右側。
  • 說到廢紙簍,如果您需要,您需要使用FSEvents來檢測何時任何廢紙簍變爲非空,NSWorkspace或Apple事件讓Finder打開廢紙簍,並向查找器發送Apple事件清空它。
  • 當用戶點擊未運行的書籤應用程序時,您將使用NSWorkspace啓動該應用程序。
  • 對於已經運行的應用程序,您需要激活它們(如果尚未激活)或「重新打開」它們(如果已經激活)。我首先嚐試啓動它們,看看在所有三種情況下是否正確;如果沒有,那麼你可以在必要時自己發送Apple Events。
  • 書籤文件夾可以在Dock中使用三種UI之一進行瀏覽:列表(菜單),網格(集合視圖)和「扇子」。菜單很容易製作,但我不確定如何製作一個popover樣式。在HUD風格的popover中,網格UI將是collection view。 「粉絲」完全是自定義的,在popover中。
  • 您需要檢測應用程序何時啓動和終止,以便將它們添加到Dock(如果尚未作爲書籤存在)並將其從中刪除(如果它們沒有添加書籤)。 NSWorkspace有這方面的通知。
  • 您可能無法獲取應用程序的自定義Dock菜單。這就是Apple Dock和AppKit之間的所有私人內容。
  • 同樣,祝你好運實施「分配到桌面」菜單項。
  • 每個應用程序的Dock菜單中的其他命令都對應於NSRunningApplication方法。
  • 您還需要處理Dock圖標視圖中的拖放操作,以便重新排序和處理用戶從Dock拖動項目以將其取消加入書籤。請記住,要處理爲正在運行的應用程序取消加書籤的情況(Dock不取消爲其加書籤,但會將應用程序恢復到原位,因爲它仍在運行)。當取消書籤時,當用戶放下書籤時播放poof effect
  • 當用戶⌘拖動Dock中的任何項目時,拖動該項目表示的文件。這在Finder上不起作用(在蘋果的Dock中,如果你願意,你可以這樣做)或垃圾桶(它不代表單個項目)。不要從Dock中移除物品。
  • 另一方面,當用戶拖拽到圖標時,當且僅當圖標表示的項目可以接收該拖動時,才應該突出顯示一個圖標。
    • 當用戶將文件拖到應用程序中時,如果所有文件的類型都在應用程序的文檔類型中,則將其突出顯示。使用NSWorkspace通過該應用程序打開文件URL完成拖動。
    • 當用戶將非文件URL拖到應用程序中時,如果所有URL的方案都在應用程序的URL方案中,則將其突出顯示。使用NSWorkspace通過該應用程序打開URL來完成拖動。
    • 當用戶將內容拖放到應用程序時,如果應用程序具有可處理拖動粘貼板上的任何內容類型的服務,則將其突出顯示。通過調用該服務完成它。 (我不知道有一個公共API可以在特定的應用程序中執行此操作,您只需使用服務名稱並希望獲得最佳效果。)
    • 當用戶將文件拖到文件夾時,將其突出顯示if該文件夾是可寫的或包含任何文件夾。如果用戶在那裏停留了一段時間,請在Finder中打開文件夾(此功能稱爲彈簧加載文件夾)。如果用戶刪除Dock中的文件夾上的文件,則通過將文件移動或複製到文件夾或通過在文件夾中爲其創建別名來完成拖動,具體取決於修改鍵的狀態。
    • 文件同樣適用於垃圾箱,但您需要爲每個文件確定正確的垃圾箱。如果文件位於主文件夾內,則正確的「廢紙簍」是主文件夾的「廢紙簍」。否則,它是文件所在卷的音量級垃圾箱。
    • 當用戶將任何音量拖到回收站時,將其圖標更改爲彈出圖標(kEjectMediaIcon,與iconForFileType:一起使用)。通過彈出音量完成拖動。如果用戶完成拖動,取消拖動或拖走垃圾箱,請將垃圾箱圖標改回。
  • 哦,你需要處理在之間拖動項目,包括分隔符之前和之後的項目。這將與我上面提到的拖動重新排序重疊。
  • 對於自動隱藏,您需要在擁有Dock的屏幕邊緣有一個與實際Dock相同寬度/高度的1-pt-height /無邊界窗口(通常爲第一個screen,如果有的話)。當用戶將鼠標懸停在此窗口上時,請顯示Dock(應遮住薄窗口)。當用戶將鼠標移出Dock時,將其隱藏。
  • 該Dock有一個上下文菜單,其中包含其分隔器上的各種選項。
  • 理想情況下,由於Dock至少有兩個主題(默認的「玻璃」主題和2D HUD風格的主題),因此您應該預料在某些時候支持主題。

讓我知道如果我錯過了任何東西。

+1

哇,彼得,這是一個很棒的描述。我從你的帖子中獲得了一些想法,謝謝。 – regulus6633

+0

嗨,彼得,我正在嘗試做類似的事情。當用戶點擊我的按鈕時,我會截取所有顯示器的屏幕截圖,並將其放置在每臺顯示器的0,0處,然後在其上覆蓋一層黑色的暗淡淡入淡出。然後用戶可以裁剪。我有一個問題,當用戶「延遲10秒」點擊我的按鈕,然後他們打開另一個應用程序全屏幕,它將工作區滑到全屏應用程序,這是正常的。但是現在,當我的10秒延遲達到0並截取該工作空間時,我希望該窗口能夠顯示該工作空間(以及所有工作空間),現在將其滾動回原始工作空間。 NSDockLevelWindow沒有工作:( – Noitidart

+0

這是我的插件它的火狐,你可以嘗試它,請看看我在說什麼:https://addons.mozilla.org/en-US/firefox/addon/nativeshot/ – Noitidart