【问题标题】:Is there Any way to imitate Lion's Launchpad?有没有办法模仿 Lion 的 Launchpad?
【发布时间】:2011-11-22 22:27:43
【问题描述】:

我一直在努力模仿 Launchpad。

一开始我想过让 NSWindow bgcolor 透明:

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

但现在我意识到这样做更理想

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

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

  1. 捕获和模糊用户使用的壁纸
  2. 将其设为 nswindow 或视图的背景图片
  3. 淡入全屏视图
  4. 单击空白处或按 ESC 淡出

是否可以在不使用私有 API 的情况下实现这些目标?

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

感谢您的建议。

【问题讨论】:

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


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

    • 代码看起来很棒。我无法用言语表达,非常感谢。到目前为止,我有一个带有壁纸的窗口作为其背景图像,但是对于这一行:“[window setFrame:[[NSScreen mainScreen] frame]];”,Xcode 警告:“NSWindow 可能无法响应 'setFrame:'。”我应该忽略它,还是我错过了一些重要的东西?对不起,如果这是个愚蠢的问题......
    • 忘了说,我项目的Base SDK是10.7,Deployment Target也是10.7。
    • -setFrame: 应该是-setFrame:display:,谢谢指出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2011-09-08
    • 1970-01-01
    • 2012-08-11
    • 2019-06-30
    • 2016-03-05
    相关资源
    最近更新 更多