为什么我的图层阴影被剪切到我的NSView的rect?

时间:2014-01-07 00:41:27

标签: cocoa calayer nsview

我正在创建一个包含NSButton的窗口(窗口内容视图和按钮都有wantsLayer = YES),并设置NSButton的shadowColor,shadowRadius,shadowOpacity和shadowOffset。但我的阴影被剪切到NSView的矩形。我该如何解决这个问题?

NSRect          wdBox = NSMakeRect(0,0,100,100);
NSWindow    *   theWindow = [[[NSWindow alloc] initWithContentRect: wdBox styleMask: NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask backing: NSBackingStoreBuffered defer: NO] autorelease];
NSView* cv = [[[NSView alloc] initWithFrame: wdBox] autorelease];
cv.wantsLayer = YES;
[cv setLayerUsesCoreImageFilters: YES];
theWindow.contentView = cv;
[theWindow setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary];
[theWindow setTitle: @"foo"];

NSButton* mView = [[NSButton alloc] initWithFrame: NSMakeRect(10, 10, 100, 80)];
[mView setLayerUsesCoreImageFilters: YES];
[mView setWantsLayer: YES];
mView.layer.masksToBounds = NO;
[mView.layer setShadowColor: [NSColor.redColor CGColor]];
[mView.layer setShadowOffset: CGSizeMake(4, 4)];
[mView.layer setShadowRadius: 8];
[mView.layer setShadowOpacity: 1.0];
[mView setBezelStyle: NSRoundRectBezelStyle];
[mView setTitle: @"bar"];
[theWindow.contentView addSubview: mView];

这是一张图片:

Clipped shadows on NSButtons

之前我有类似的代码,它曾经工作到10.9,但影子突然被剪切到了视图,所以我把它改写成这个简单的情况,但它仍然被修剪。

1 个答案:

答案 0 :(得分:2)

小牛队有一个小虫。如果你在XIB中创建一个NSButton并给它一个图层并设置它的阴影它工作正常,但如果你以编程方式创建一个它剪辑它的阴影。

我怀疑AppKit团队做了一些疯狂的黑客攻击,当他们让按钮在小牛队做快速图层合成时(例如,他们不会重绘他们的背景,除非现在必要),因为他们试图让这一切都神奇地发生,这是总是一个坏主意。

请注意,如果您创建NSTextField,则阴影代码可以按预期工作。我发现这只是NSButtons(到目前为止)有这个问题。

请提交雷达。