有没有办法模仿Lion的Launchpad?

pro*_*vdr 1 macos xcode cocoa objective-c osx-lion

我一直在努力模仿Launchpad.

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

//make NSWindow's bgcolor transparent
[window setOpaque:NO];
[window setBackgroundColor:[NSColor clearColor]];
Run Code Online (Sandbox Code Playgroud)

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

  1. 捕捉壁纸
  2. 模糊它并使它成为NSWindow或视图的bg-image

而不是隐藏所有打开的窗户和菜单栏,这是我第一次想到的想法(如果你有更好的想法,仍然不确定更好......).

  1. 捕捉和模糊用户使用的壁纸
  2. 为nswindow或视图创建背景图像
  3. 淡入全屏视图
  4. 单击某处空白或按ESC退出

那些可以在不使用私有API的情况下实现吗?

对不起,如果不清楚我的英语不好.我只是想模仿Launchpad风格的全屏幕.

谢谢你的建议.

Isa*_*bel 8

要获取桌面背景的图像,请使用:

NSURL *imageURL = [[NSWorkspace sharedWorkspace] desktopImageuRLForScreen:[NSScreen mainScreen]
NSImage *theDekstopImage = [[NSImage alloc] initWithContentsOfURL:imageURL];
Run Code Online (Sandbox Code Playgroud)

您可以使用CIFilter模糊图像.这是一个描述如何应用过滤器的Apple文档.

然后,您可以将该图像加载为一种颜色,并将其设置为窗口的背景颜色.此外,将窗口设置为没有样式掩码(没有关闭按钮,标题框等),覆盖屏幕,并且在除了扩展坞之外的所有内容之前:

[yourWindow setBackgroundColor:[NSColor colorWithPatternImage:theDesktopImage]];
[yourWindow setStyleMask:NSBorderlessWindowMask];
[yourWindow setLevel:kCGDockWindowLevel - 1];
[yourWindow setFrame:[[NSScreen mainScreen] frame] display:YES];
Run Code Online (Sandbox Code Playgroud)

要让窗口淡入,您可以使用NSWindow的动画代理.(将1.0替换为0.0以使其淡出.)

[[yourWindow animator] setAlphaValue:1.0];
Run Code Online (Sandbox Code Playgroud)

当然你可以使用像CoreAnimation这样的东西来定制更多,但这应该可以正常工作.

为了处理后台点击,我建议你-orderOut:在窗口上创建一个NSView的子类-mouseDown:.然后放置一个跨越窗口整个框架的子类的实例.

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

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