mac app的背景可以透明吗?

mea*_*a36 3 macos graphics quartz-2d

我正在使用quartz2d制作我的第一个mac应用程序,我想知道是否可以使背景透明.这意味着,如果所有应用程序都设置了背景透明,那么当它运行时,您将看到除了它背后的应用程序之外的任何内容.

我觉得这是不可能的,但我想我还是会问.

Jea*_*ean 6

实际上,这是可能的.

您甚至可以使应用程序的完全透明窗口成为点击.请参阅:在Mac OS X上绘制自定义窗口.

构建透明窗口

制作自定义窗口以透明窗口开始.我将使用名为RoundWindow的自定义NSWindow子类.这个子类的构造函数如下所示:

- (id)initWithContentRect:(NSRect)contentRect
    styleMask:(NSUInteger)windowStyle
    backing:(NSBackingStoreType)bufferingType
    defer:(BOOL)deferCreation
{
    self = [super
        initWithContentRect:contentRect
        styleMask:NSBorderlessWindowMask
        backing:bufferingType
        defer:deferCreation];
    if (self)
    {
        [self setOpaque:NO];
        [self setBackgroundColor:[NSColor clearColor]];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

这个构造函数对窗口所做的三个更改是相当明显的:

  • NSBorderlessWindowMask(没有标准窗口框架的窗口)
  • setOpaque:NO(这样窗口的任何部分都可以透明)
  • setBackgroundColor:[NSColor clearColor](如果我们什么都不做,这会把窗口画成透明的)

结果是一个透明的矩形窗口.可以直接调用此方法(如果在代码中创建窗口).从NIB加载窗口时,NIB加载程序也会调用它.

由于此窗口使用NSBorderlessWindowMask样式,因此我们必须覆盖canBecomeKeyWindow和canBecomeMainWindow方法以返回YES.这些覆盖将允许窗口分别成为键盘焦点和主应用程序窗口.

来源: 在Mac OS X上绘制自定义窗口.