2011-09-22 45 views
1

我一直在努力模仿Launchpad。有沒有辦法模仿Lion的Launchpad?

在開始的時候我想過讓NSWindow的bgcolor透明:

//make NSWindow's bgcolor transparent 
[window setOpaque:NO]; 
[window setBackgroundColor:[NSColor clearColor]]; 

但現在我意識到它的方式更理想的

  1. 捕捉壁紙
  2. 模糊它,使BG-圖像爲NSWindow或視圖

而不是隱藏所有打開窗戶和菜單欄,這是我帶來的第一個想法(如果你有更好的主意,仍然不確定更好)。用戶使用

  1. 捕捉&模糊壁紙
  2. 讓它背景圖像nswindow或視圖
  3. 淡入到全屏視圖
  4. 點擊某處空白或按ESC淡出

這些可能實現而不使用私人API?

對不起,如果不清楚我可憐的英語。 只是我試圖模仿Launchpad風格的全屏。

感謝您的任何建議。

回答

8

要拿到桌面背景的圖像,使用方法:

NSURL *imageURL = [[NSWorkspace sharedWorkspace] desktopImageuRLForScreen:[NSScreen mainScreen] 
NSImage *theDekstopImage = [[NSImage alloc] initWithContentsOfURL:imageURL]; 

可以使用CIFilter圖像模糊。 Here's a Apple doc describing how to apply filters.

然後,您可以將該圖像加載到一個顏色中,並將其設置爲該窗口的背景顏色。此外,設置窗口有沒有風格掩模(沒有關閉按鈕,標題幀等),覆蓋屏幕,並且在所有內容的前面以外的船塢:

[yourWindow setBackgroundColor:[NSColor colorWithPatternImage:theDesktopImage]]; 
[yourWindow setStyleMask:NSBorderlessWindowMask]; 
[yourWindow setLevel:kCGDockWindowLevel - 1]; 
[yourWindow setFrame:[[NSScreen mainScreen] frame] display:YES]; 

要具有在窗口褪色,你可以使用NSWindow的動畫代理。 (替換1.0 0.0,使其淡出。)

[[yourWindow animator] setAlphaValue:1.0]; 

當然,你可以自定義多一點的東西像CoreAnimation,但是這應該只是罰款。

爲了處理背景點擊,我建議製作一個NSView的子類,你的-orderOut:你的窗口在-mouseDown:上。然後放置一個跨越整個窗口框架的子類的實例。

此外,NSViews有時不關鍵事件作出響應,這樣你就可以添加事件偵聽器來檢測ESC鍵被按下,而你的應用處於活動狀態的任何時間:

[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:(NSEvent *ev)^ { 
    if([ev keyCode] == 0x53) { 
     [yourWindow orderOut:self]; 
    } 
    return ev; 
} 
+1

代碼看起來真棒。我無法用言語表達,非常感謝。到目前爲止,我用窗口作爲背景圖像,但是對於這一行:「[window setFrame:[[NSScreen mainScreen] frame]];」,Xcode警告:「NSWindow可能不會響應'setFrame:'。我應該忽略它嗎,還是我錯過了一些重要的東西?對不起,如果這是愚蠢的問題... – provdr

+0

忘了提及,我的項目的基礎SDK是10.7,部署目標也是10.7。 – provdr

+0

-setFrame:應該是-setFrame:display :,謝謝指出 – Isabel