我正在使用Xcode5为MacOSX开发应用程序,该应用程序在全屏应用程序中运行
我需要多次展示某些与其他NSWindowControllers不全屏的NSWindowControllers
然后我需要让我的背景更暗,以帮助用户专注于重要信息,我正在考虑找到一种方法来修改NSWindowController的影子,但我无法找到任何东西,我'我不知道如何实现这个目标:
当前窗口:
期望效果
这是我用来打开NSWindowController的代码:
- (IBAction)showMyNSWindowController:(id)sender{
if (!_myNSWindowController) {
_myNSWindowController = [[MyNSWindowController alloc]initWithWindowNibName:@"MyNSWindowController"];
[_myNSWindowController.window setBackgroundColor: NSColor.whiteColor];
}
[_myNSWindowController setDelegate:self];
[_myNSWindowController initializeData];
[_myNSWindowController showWindow:self];
}
编辑:我可以通过这样做来实现它
AppDelegate.m
typedef void * CGSConnection;
extern OSStatus CGSSetWindowBackgroundBlurRadius(CGSConnection connection, NSInteger windowNumber, int radius);
extern CGSConnection CGSDefaultConnectionForThread();
- (void)enableBlurForWindow:(NSWindow *)window
{
[window setOpaque:NO];
window.backgroundColor = [NSColor colorWithCalibratedWhite:0.0 alpha:0.5];
CGSConnection connection = CGSDefaultConnectionForThread();
CGSSetWindowBackgroundBlurRadius(connection, [window windowNumber], 20);
}
- (IBAction)showMyNSWindowController:(id)sender{
if (!_myNSWindowController) {
_myNSWindowController = [[MyNSWindowController alloc]initWithWindowNibName:@"MyNSWindowController"];
[_myNSWindowController.window setFrame:[[NSScreen mainScreen] frame] display:YES];
[_myNSWindowController.window setOpaque:NO];
[_myNSWindowController.window setBackgroundColor: [NSColor colorWithCalibratedHue:0.0
saturation:0.0
brightness:0.2
alpha:0.5]];
[_myNSWindowController.window setMovable:FALSE];
[self enableBlurForWindow:_myNSWindowController.window];
}
[_myNSWindowController setDelegate:self];
[_myNSWindowController initializeData];
[_myNSWindowController showWindow:self];
}
我修改了我的NSWindowController,添加了一个NSView并将所有内容放在这里:
这是inicialization的代码:
MyNSWindowController.m
-(void)initializeData{
CALayer *viewLayer = [CALayer layer];
[viewLayer setCornerRadius:5];
[viewLayer setBackgroundColor:CGColorCreateGenericRGB(255.0, 255.0, 255.0, 1)]; //RGB plus Alpha Channel
[_containerView setWantsLayer:YES]; // view's backing store is using a Core Animation Layer
[_containerView setLayer:viewLayer];
[_containerView setFrameOrigin:NSMakePoint(
(NSWidth ([_parentView bounds]) - NSWidth([_containerView frame])) / 2,
(NSHeight([_parentView bounds]) - NSHeight([_containerView frame]))/ 2)];
[_containerView setAutoresizingMask:NSViewMinXMargin | NSViewMaxXMargin | NSViewMinYMargin | NSViewMaxYMargin];
}
最终结果:
答案 0 :(得分:3)
这几乎是"模式"窗口。您可以尝试使用NSApplication
CALayer
,但这可能不是您想要的,因为它会阻止主事件循环,以防止与模态窗口之外的事物进行交互。
没有什么可以阻止你将窗口视为具有半透明背景的屏幕尺寸,并将当前窗口内容添加为居中子视图(如果这是更理想的话)。
modal window functionality是类似行为的一个很好的例子,你可能会发现它很有用。它使用CIFilter
和NSWindowController
来实现更加精细的效果,即变暗(及其<100行代码)。
BTW NSWindow
没有&#34;影子&#34;它是不一个UI元素(因此&#34;控制器&#34;其名称的一部分);你在考虑{{1}}。这种区别可以帮助您进一步搜索。