我有一个NSWindow,可以在其他窗口上以模态方式显示以显示警报。 代码是:
// This code is in MyAlert .m file. MyAlert inherits from NSWindow
- (void)showInWindow:(NSWindow *) {
[window beginSheet:self completionHandler:NULL];
}
问题是,当在运行Mojave的Mac中使用Xcode 10.1进行编译时,我在警报后面看到了一个灰色的“模糊”视图,我不希望出现在该视图中:我希望背景窗口显示为可见。
使用Xcode 9.4.1编译的相同代码不会显示该模糊视图。
此外,我调试了UI,并确实在Xcode 10.1编译版本中插入了NSVisualEffectView,该版本在9.4.1上编译时不存在,但是我似乎找不到摆脱它的方法。 下面是在两个版本中调试的UI的屏幕截图。
有人面对并想出了这个吗?
更新(插入的nsvisualeffectview的最小项目复制问题):http://s000.tinyupload.com/?file_id=43114618701497778758
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
__weak typeof(self)weakSelf = self;
NSView *contentView = self.window.contentView;
contentView.wantsLayer = YES;
[self.window setOpaque:NO];
[self.window setHasShadow:NO];
contentView.layer.backgroundColor = [NSColor redColor].CGColor;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf showAlert];
});
}
- (void)showAlert {
DummyAlertWindowController *alertController = [[DummyAlertWindowController alloc] initWithWindowNibName:@"DummyAlertWindowController"];
[self.window beginSheet:alertController.window completionHandler:^(NSModalResponse returnCode) {
;
}];
}
@implementation DummyAlertWindowController
- (void)windowDidLoad {
[super windowDidLoad];
self.properContentView.wantsLayer = YES;
self.properContentView.layer.backgroundColor = [NSColor blueColor].CGColor;
[self.window setOpaque:NO];
[self.window setHasShadow:NO];
self.window.contentView.wantsLayer = YES;
self.window.contentView.layer.backgroundColor = [NSColor clearColor].CGColor;
}
@end
答案 0 :(得分:2)
通过使窗口无边界,可以恢复无霜外观。
将此类添加到您的项目中。
@interface BorderlessWindow : NSWindow
@end
@implementation BorderlessWindow
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)style backing:(NSBackingStoreType)backingStoreType defer:(BOOL)flag {
self = [super initWithContentRect:contentRect
styleMask:NSWindowStyleMaskBorderless
backing:backingStoreType
defer:flag];
return self;
}
@end
并将XIB
中的窗口类设置为BorderlessWindow
最后在窗口上设置backgroundColor
以获得透明度。
@implementation DummyAlertWindowController
- (void)windowDidLoad {
[super windowDidLoad];
//stuff
[self.window setOpaque:NO];
[self.window setHasShadow:NO];
[self.window setBackgroundColor:[NSColor clearColor]];
}
@end
作为旁注,使用wantsLayer
来获取backgroundColors现在可以通过使用具有自定义颜色的自定义样式NSBox
或在窗口上使用backgroundColor
属性来更好地解决。