Layer-Backed视图不再在透明的NSWindow中打孔

时间:2013-02-22 04:02:27

标签: cocoa calayer nsview quartz-core

我正在尝试使用CAShapeLayer甚至只是一个CALayer在NSWindow中建立一个“洞”。

使用常规NSView甚至是图层支持的视图时,我可以覆盖drawRect:使用如下代码:

        [spotImage drawInRect:self.bounds fromRect:NSZeroRect operation:NSCompositeXOR fraction:1.0];

其中spotImage是具有纯白色内容和一些渐变的NSImage,窗口具有0.5 alpha的黑色背景。定义此drawRect的NSView子类具有clearColor背景。

最终结果是一个灰色窗口(它是一个透明窗口,其样式的NSBorderlessWindowMask可以在许多样本中找到。

如果我将NSView转换为图层支持的视图,它会调用drawRect方法并且工作正常。

当我将其转换为图层托管视图,并再次使用相同的结构(NSWindow> contentView> CustomView)时,drawInRect方法只是绘制图像。它不再穿过它。

当层是层托管层次结构的一部分时,层本身就不能再打孔了。

以下是一些示例代码:

自定义NSWindow子类初始化程序:

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

self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];

if (self) {

   [self setBackgroundColor: [NSColor lightGrayColor]]; //[NSColor clearColor]];

    [self setAlphaValue:0.5];

    [self setOpaque:NO];
    [self setHasShadow: NO];

    [self useOptimizedDrawing:YES];
    [self setIgnoresMouseEvents:YES];
}
return self;

}

我的applicationDidFinishLaunching方法中的代码:

PPContentView *thisView = [[PPContentView alloc]
                    initWithFrame:CGRectInset([self.window.contentView bounds], 50, 50)];

//[thisView setWantsLayer:YES]; enabling this makes things opaque again

[self.window.contentView addSubview:thisView];

thisView.layer.backgroundColor = [NSColor clearColor].CGColor;

//Create custom content
[thisView setNeedsDisplay:YES];

}

我的自定义视图的drawRect包含:

    [[NSImage imageNamed:@"spotFuzzy.png"] drawInRect:self.bounds fromRect:NSZeroRect operation:NSCompositeXOR fraction:1.0];

0 个答案:

没有答案