2009-12-21 5 views
3

открыть окно со следующим:NSOpenPanel над полноэкранным NSWindow?

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?
  • Есть ли способ заставить панель меню не отображаться на решении листа, которое я пытаюсь сделать выше?

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

+0

Не забудьте проверить возвращаемое значение из '[super init ...]'. –

ответ

3

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

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

... то есть: открыть панель как это собственное окно, и именно это я хотел сделать в первом месте (duh!)

2

КИ, 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); 
      }]; 

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

3

Вы можете создать категорию NSSavePanel, как это:

@implementation NSSavePanel (SavePanelSetLevel) 

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

@end 

потому runModal сброса уровня ранее установленного!

Смежные вопросы