有没有办法模仿Lion的Launchpad?

时间:2011-09-22 14:59:46

标签: objective-c xcode macos cocoa osx-lion

我一直在努力模仿Launchpad。

一开始我想到让NSWindow bgcolor变得透明:

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

但现在我意识到这种方式更为理想

  1. 捕捉壁纸
  2. 模糊它并使其成为NSWindow的bg-image或视图
  3. 而不是隐藏所有打开的窗口和菜单栏,这是我第一个想到的想法(如果你有更好的想法,仍然不确定更好......)。

    1. 捕获&模糊用户使用的壁纸
    2. 为nswindow或视图制作背景图片
    3. 淡入全屏视图
    4. 单击某处空白或按ESC退出
    5. 那些可以在不使用私有API的情况下实现吗?

      很抱歉,如果不清楚我的英语不好。 我只是想模仿Launchpad风格的全屏幕。

      感谢您的任何建议。

1 个答案:

答案 0 :(得分: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这样的东西来定制更多,但这应该可以正常工作。

要处理后台点击,我建议您在-orderOut:-mouseDown:窗口中创建NSView的子类。然后放置一个跨越窗口整个框架的子类的实例。

此外,NSView有时不会响应键事件,因此您可以添加一个事件侦听器来检测应用程序处于活动状态时按下转义键的任何时间:

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