Xcode 10 - NSVisualEffectView добавляется в NSWindow при отображении модально (Mac OS) - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть NSWindow, которое я отображаю модально в каком-то другом окне для отображения предупреждений.Код:

// This code is in MyAlert .m file. MyAlert inherits from NSWindow
- (void)showInWindow:(NSWindow *) {
    [window beginSheet:self completionHandler:NULL];
}

Дело в том, что при компиляции с Xcode 10.1 на Mac под управлением Mojave я вижу серый «размытый» вид за предупреждением, которого я там не хочу: я хочу фоновое окногде это показано, чтобы быть видимым.

Тот же код, скомпилированный с Xcode 9.4.1, не показывает это размытое представление.

Кроме того, я отладил пользовательский интерфейс, и действительно есть NSVisualEffectView, вставленный в Xcode 10.1скомпилированная версия, которой нет при компиляции на 9.4.1, но я не могу найти способ избавиться от нее.Ниже приведены снимки экрана интерфейса пользователя, отлаженного в обеих версиях.

Xcode 9 UI, no blur

Xcode 10 UI, blurring

Кто-то сталкивалсяи понял это?

Обновление (минимальный проект, воспроизводящий проблему вставленного 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

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете восстановить свой не матовый внешний вид, сделав окно без полей.

enter image description here

Добавьте этот класс в свой проект.

@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 в окне.

...