将NSPanel显示为创建偏移的工作表

时间:2013-08-06 11:50:48

标签: macos cocoa nswindow nspanel

我正在使用此代码显示一个面板:

- (void)displayPanelWithView:(NSView *)view andTitle:(NSString *)title {
    [panel setTitle:title];    
    if ([windows count] < 1) {
        [panel setContentSize:[view frame].size];
        [panel setContentView:view];
        [panel center];
        [panel makeKeyAndOrderFront:nil];
    }
    else {
        [panel setContentSize:[view frame].size];
        [panel setContentView:view];
        [NSApp beginSheet:panel modalForWindow:[windows objectAtIndex:0] modalDelegate:self     didEndSelector:nil contextInfo:NULL];
    }
}

panel是IBOutlet(它在IB中实例化)。它是NSPanel的子类。

windows是一个窗口数组。如果没有窗口,则面板显示为新窗口。

问题

当我显示具有特定视图的面板,并且windows 为空时,面板显示为工作表。第一次发生这种情况时,始终存在偏移。以下是第一次调用该方法时的屏幕截图,以及第二次调用该方法时的屏幕截图(windows都不为空):

First time

Second time

如果我使用此错误可能会消失:

[panel setStyleMask:NSBorderlessWindowMask];

在这种情况下,尺寸是正确的,但是纸张不再聚焦并保持不聚焦(因此上面屏幕截图中的蓝色按钮始终为白色)。 我该怎么做才能让每次都能正确显示工作表?第一次不会在下次发生时会发生什么?

1 个答案:

答案 0 :(得分:0)

我设法通过使用此代码来解决问题:

- (void)displayPanelWithView:(NSView *)view andTitle:(NSString *)title {
    [panel setTitle:title];    
    if (![defaults floatForKey:@"SS_Interface_Mode"] == 0 || [windows count] < 1) {
        [panel setContentSize:[view frame].size];
        [[panel contentView] addSubview:view];
        [panel center];
        [panel makeKeyAndOrderFront:nil];
    }
    else {
        [panel setContentSize:[view frame].size];
        [[panel contentView] addSubview:view];
        [NSApp beginSheet:panel modalForWindow:[windows objectAtIndex:0] modalDelegate:self didEndSelector:nil contextInfo:NULL];
    }
}
- (IBAction)endSheet:(id)sender {
    [NSApp endSheet:panel];
    [panel orderOut:nil];
    for (NSView *view in [[panel contentView] subviews])
        [view removeFromSuperview];
}

如您所见,我将视图添加到面板的当前内容视图,而不是将其指定为面板的新内容视图。