如何实现HUD风格的窗口,如地址簿的"大型显示"

amr*_*rox 8 macos cocoa hud

包括内置地址簿在内的多个应用程序使用半透明的HUD窗口,带有大阴影文本.我想在我的Cocoa Mac应用程序中实现一个类似的窗口.

截图

在某处可以自由实现这种窗口吗?

如果没有,实施它的最佳方法是什么?

NSG*_*God 23

这是一个展示如何操作的示例项目:

http://github.com/NSGod/BlackBorderlessWindow

基本上,您需要创建一个无边界的NSWindow子类.最简单的方法是在nib文件中设置窗口大小和排列,然后将其类设置为自定义子类.因此,虽然它仍然看起来像Interface Builder中的普通窗口,但在运行时它将显示为您需要它.

@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;
}
Run Code Online (Sandbox Code Playgroud)

alpha值将使窗口半透明.

此外,您可以创建一个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
Run Code Online (Sandbox Code Playgroud)

与窗口一样,您只需将窗口的contentView类设置为自定义NSView子类.(使用大纲视图模式并单击显示三角形以显示嵌套NSView在nib文件中窗口图标内的内容).同样,虽然视图在Interface Builder中看起来很普通,但在运行时它看起来还不错.

然后只需NSTextField在视图顶部放置并相应地设置文本.

请注意,通常,无边框窗口不易使用(例如,如果您希望能够拖动窗口,则需要自己添加该功能).例如,Apple提供了一些关于如何允许拖动的示例代码.

替代文字

  • @amrox:嗯,我专门制作了这个演示;-)(实际上,我已经有了一个无边界窗口的示例项目,只需要花一点时间来调整它就可以做你想做的事情). (2认同)