gpt4 book ai didi

macos - 如何显示 NSWindow(非全屏)并将屏幕的其余部分变暗 Xcode5 cocoa

转载 作者:行者123 更新时间:2023-12-03 16:19:35 27 4
gpt4 key购买 nike

我正在使用 Xcode5 开发一个适用于 MacOSX 的应用程序,该应用程序在全屏应用程序中运行

有几次我需要显示某些 NSWindowController,这些 NSWindowController 不像其他 NSWindowController 那样全屏显示

然后我需要使背景变暗以帮助用户专注于重要信息,我正在考虑找到一种方法来修改 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];
}

我通过添加 NSView 并将所有内容放入其中来修改我的 NSWindowController:

enter image description here

这是初始化代码:

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

最佳答案

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

没有什么可以阻止您将窗口设置为具有半透明背景的屏幕大小,并将当前窗口内容添加为居中 subview (如果更需要的话)。

here这是类似行为的一个很好的例子,您可能会发现它很有用。它使用 CALayerCIFilter 来实现比变暗(及其 <100 行代码)更精细的效果。

顺便说一句,NSWindowController 没有“影子”,它不是 UI 元素(因此其名称中的“ Controller ”部分);你正在考虑NSWindow。这种区别可能会帮助您进行进一步的搜索。

关于macos - 如何显示 NSWindow(非全屏)并将屏幕的其余部分变暗 Xcode5 cocoa ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25070150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com