我正在尝试使用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];