如何显示NSWindow(不是全屏)并将所有其余的屏幕变暗Xcode5可可

时间:2014-07-31 22:44:50

标签: macos cocoa nswindow shadow

我正在使用Xcode5为MacOSX开发应用程序,该应用程序在全屏应用程序中运行

我需要多次展示某些与其他NSWindowControllers不全屏的NSWindowControllers

然后我需要让我的背景更暗,以帮助用户专注于重要信息,我正在考虑找到一种方法来修改NSWindowController的影子,但我无法找到任何东西,我'我不知道如何实现这个目标:

当前窗口:

enter image description here

期望效果

enter image description here

这是我用来打开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并将所有内容放在这里:

enter image description here

这是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];
}

最终结果:

enter image description here

1 个答案:

答案 0 :(得分:3)

这几乎是"模式"窗口。您可以尝试使用NSApplication CALayer,但这可能不是您想要的,因为它会阻止主事件循环,以防止与模态窗口之外的事物进行交互。

没有什么可以阻止你将窗口视为具有半透明背景的屏幕尺寸,并将当前窗口内容添加为居中子视图(如果这是更理想的话)。

modal window functionality是类似行为的一个很好的例子,你可能会发现它很有用。它使用CIFilterNSWindowController来实现更加精细的效果,即变暗(及其<100行代码)。

BTW NSWindow没有&#34;影子&#34;它是一个UI元素(因此&#34;控制器&#34;其名称的一部分);你在考虑{{1}}。这种区别可以帮助您进一步搜索。