8

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

截屏

在某处有这种窗口的免费实现吗?

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

4

2 回答 2

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

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

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

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

请注意,一般来说,无边界窗口并不容易使用(例如,如果您希望能够拖动窗口,则需要自己重新添加该功能)。例如,Apple 有一些关于如何允许拖动的示例代码。

替代文字

于 2010-12-15T05:58:45.347 回答
3

感谢您分享此代码。帮了我很多!您可以添加以下行...

[self setBackgroundColor:[NSColor clearColor]];

到窗口的init函数。这将删除白色角落。

于 2012-11-08T20:20:13.423 回答