Есть ли способ подражать Lion's Launchpad? - PullRequest
1 голос
/ 22 сентября 2011

Я изо всех сил пытался подражать 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.

Спасибо за любой совет.

1 Ответ

8 голосов
/ 23 сентября 2011

Чтобы получить изображение фона рабочего стола, используйте:

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

Вы можете размыть изображение с помощью CIFilter. Вот документ Apple, описывающий, как применять фильтры.

И затем вы можете загрузить это изображение в цвет и установить его в качестве цвета фона для окна.Кроме того, установите в окне отсутствие маски стиля (без кнопок закрытия, рамки заголовка и т. Д.), Закройте экран и окажитесь перед всем, кроме дока:

[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 иногда не реагируют на события клавиш, поэтому вы можете добавить прослушиватель событий для обнаружения в любое время при нажатии клавиши escapeпока ваше приложение активно:

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