2011-09-22 80 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

相关问题