NSOpenPanel над полноэкранным NSWindow? - PullRequest
3 голосов
/ 21 декабря 2009

Я открываю окно со следующим:

NSRect screenRect = [[NSScreen mainScreen] frame];
[super initWithContentRect:screenRect 
               styleMask:NSBorderlessWindowMask 
                 backing:NSBackingStoreBuffered 
                   defer:NO]; 
int windowLevel = CGShieldingWindowLevel();
[self setLevel:windowLevel];

... так что окно полноэкранное и выше всех остальных уровней окна (включая модальные окна). Позже я хочу отобразить открытую панель, однако следующее открывает диалоговое окно под окном, которое я создал выше (кажется, что runModal переопределяет запрошенный уровень окна, который я пытаюсь установить):

  NSOpenPanel *OP = [NSOpenPanel openPanel];      
  int windowLevel = CGShieldingWindowLevel();
  [OP setLevel:windowLevel];
  int returnCode = [OP runModal];

... и следующее открывает лист в окне, созданном выше (хорошо), однако также появляется строка меню, которую я ранее скрыл (не то, что я хочу):

  NSOpenPanel *OP = [NSOpenPanel openPanel];      
  [OP beginSheetModalForWindow:[self window]
             completionHandler:^(NSInteger returnCode) {
               NSLog(@"completionHandler called with %d", returnCode);
             }];

... так что мои вопросы:

  • Кто-нибудь знает, как открыть модальное окно над CGShieldingWindowLevel?
  • Есть ли способ заставить строку меню не показываться на листовом решении, которое я пробовал выше?

Спасибо всем: -)

Ответы [ 3 ]

3 голосов
/ 08 марта 2010

ОК, вот еще лучший вариант - я полностью его пропустил, когда я просматривал документы:

NSOpenPanel *OP = [NSOpenPanel openPanel];
[OP setLevel:CGShieldingWindowLevel()];
[OP beginWithCompletionHandler:^(NSInteger returnCode) {
  NSLog(@"completionHandler called with %d", returnCode);
}];

... то есть: откройте панель как отдельное окно, что я и хотел сделать в первом месте (да!)

3 голосов
/ 01 июня 2011

Вы можете создать категорию NSSavePanel следующим образом:

@implementation NSSavePanel (SavePanelSetLevel)

- (void)setLevel:(NSInteger)newLevel
{
    [super setLevel:CGShieldingWindowLevel()] ; // NSWindow implementation call
}

@end

потому что runModal сбрасывает ранее установленный уровень!

2 голосов
/ 04 января 2010

ОК, 5 лет спустя, я могу сделать эту работу - хитрость заключается в том, чтобы открыть второе окно, продвинуть его в CGShieldingWindowLevel, сделать его ключом и упорядочить фронт, затем прикрепить к нему открытый лист - лист волшебным образом появляется там, где находится второе окно, и хотя оно и не идеально, оно выглядит намного лучше, чем решение, которое я придумал изначально. Вот изменение:

  NSOpenPanel *OP = [NSOpenPanel openPanel];

  // this is the new bit - make the window 1x1 @ the location of your liking
  NSRect windowRect = NSMakeRect(0, 1000, 1, 1);
  NSWindow *OPW = [[NSWindow alloc] initWithContentRect:windowRect 
                                              styleMask:NSBorderlessWindowMask 
                                                backing:NSBackingStoreBuffered 
                                                  defer:NO];  
  int windowLevel = CGShieldingWindowLevel();
  [OPW setLevel:windowLevel];
  [OPW makeKeyAndOrderFront:nil];
  // end of new bit, apart from passing OPW for beginSheetModalForWindow
  // instead of [self window]

  [OP beginSheetModalForWindow:OPW
             completionHandler:^(NSInteger returnCode) {
               NSLog(@"completionHandler called with %d", returnCode);
             }];

... единственная мысль, на которую следует обратить внимание, это то, что с помощью приведенного ниже вы можете открыть несколько открытых диалогов, так как лист является модальным для окна, отличного от главного окна - главное окно все еще может принимать щелчок мыши события ...

...