Как реализовать окно в стиле HUD, например, «Показать в большом шрифте» в адресной книге - PullRequest
8 голосов
/ 15 декабря 2010

Несколько приложений, в том числе встроенная адресная книга, используют полупрозрачное окно HUD с большим затененным текстом.Я хотел бы реализовать подобное окно в моем приложении Cocoa Mac.

screenshot

Есть ли где-нибудь бесплатная реализация такого вида окна?Каков наилучший способ его реализации?

Ответы [ 2 ]

23 голосов
/ 15 декабря 2010

Вот пример проекта, который показывает, как это сделать:

http://github.com/NSGod/BlackBorderlessWindow

По сути, вам нужно создать подкласс NSWindow без полей. Самый простой способ сделать это - установить размер и расположение окна в nib-файле, а затем установить его класс в качестве собственного подкласса. Таким образом, хотя оно все равно будет выглядеть как обычное окно в Интерфейсном Разработчике, во время выполнения оно будет отображаться так, как вам нужно.

@implementation MDBorderlessWindow

- (id)initWithContentRect:(NSRect)contentRect
            styleMask:(NSUInteger)windowStyle
              backing:(NSBackingStoreType)bufferingType
                defer:(BOOL)deferCreation {

    if (self = [super initWithContentRect:contentRect
                            styleMask:NSBorderlessWindowMask
                              backing:NSBackingStoreBuffered defer:deferCreation]) {
            [self setAlphaValue:0.75];
            [self setOpaque:NO];
            [self setExcludedFromWindowsMenu:NO];
    }
    return self;
}

Значение альфа сделает окно полупрозрачным.

Также вы можете создать собственный подкласс NSView, который будет рисовать круглый прямоугольник:

@implementation MDBlackTransparentView

- (id)initWithFrame:(NSRect)frame {
    if (self = [super initWithFrame:frame]) {

    }
    return self;
}

- (void)drawRect:(NSRect)frame {
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:frame
                                    xRadius:6.0 yRadius:6.0];
    [[NSColor blackColor] set];
    [path fill];
}

@end

Как и в случае с окном, вы просто устанавливаете класс contentView окна в качестве своего пользовательского NSView подкласса. (Используйте режим просмотра контура и щелкните треугольник раскрытия, чтобы отобразить вложенный NSView внутри значка окна в файле пера). Опять же, хотя представление будет выглядеть в Interface Builder обычным образом, во время выполнения оно будет выглядеть нормально.

Затем просто поместите NSTextField поверх вида и установите текст соответствующим образом.

Обратите внимание, что, как правило, с окнами без полей нелегко работать (например, если вы хотите иметь возможность перетаскивать окно, вам нужно добавить эту функцию обратно самостоятельно). Например, у Apple есть пример кода о том, как разрешить перетаскивание.

alt text

3 голосов
/ 09 ноября 2012

Спасибо, что поделились этим кодом.Мне очень помогли!Вы можете добавить следующую строку ...

[self setBackgroundColor:[NSColor clearColor]];

к функции init окна.Это удаляет белые углы.

...