objective-c - NSWindow 自动保存 - 位置未保存在第二台显示器上

标签 objective-c nswindow nswindowcontroller autosave

在优胜美地(可能更早)中,窗口框架自动保存机制不支持已从主显示器移动到第二个显示器的窗口的自动定位,或与第二个显示器重叠的任何位置。

相反,当下次实例化时,窗口会自动定位到之前的位置(如果在默认值中记录了有效位置)或窗口的默认位置,或者在重叠窗口的情况下,将窗口完全在主屏幕上。

无论自动保存名称属性是在 Interface Builder 中的窗口上设置的,还是通过 NSWindowController 设置的,都会发生这种情况。例如

-(void)windowDidLoad
{
    [super windowDidLoad];
    [self setShouldCascadeWindows:NO];
    [self setWindowFrameAutosaveName:@"MyWindowAutoSaveName"];
}

有人知道解决方法吗?

最佳答案

我永远无法让自动保存恢复到第二台显示器。再多的鞭打也无法奏效。它将恢复到与窗口在第二个监视器上相同的 xy 位置的第一个监视器。为了解决这个问题,我放弃了使用自动保存 API 并制作了自己的 API。

当窗口的 windowWillClose: 方法被调用时,首先存储一个 bool 值,指示窗口是否全屏缩放。接下来,如果窗口未缩放(稍后会详细介绍),请使用 NSStringFromRect 并保存窗口的框架矩形。

-(void)windowWillClose:(NSNotification *)notification
{
  NSString  *mainWindowFrameString;

  [_defaults setObject:[NSNumber numberWithBool:[_flimFlamViewController windowIsFullScreen]] forKey:QUITTING_ZOOM_STATE];

  if ([_flimFlamViewController windowIsFullScreen] == NO) {
    mainWindowFrameString = NSStringFromRect([_ourWindow frame]);
    [_defaults setObject:mainWindowFrameString forKey:MAIN_WINDOW_FRAME];
    }

  [_defaults synchronize];

}

相反,在创建窗口时(可能在 awakeFromNib 中:) 从 NSUserDefaults 加载字符串并使用 NSRectFromString 获取边界。检查框架尺寸是否为零,看看这是否是应用程序第一次启动。如果框架不全为零,则将窗口的框架设置为该 CGRect。

  mainWindowFrameString = [_defaults objectForKey:MAIN_WINDOW_FRAME];       // get the last saved window frame values
  mainWindowFrame = NSRectFromString(mainWindowFrameString);                // convert it to a CGRect

  if ((mainWindowFrame.size.width != 0) && (mainWindowFrame.size.height != 0)) {
    [_ourWindow setFrame:mainWindowFrame display:YES];
    }
  else {
    [_ourWindow center];
    }

要处理窗口关闭时全屏缩放的情况,首先在全屏之前保存框架的位置 - 稍后当窗口重新打开以将窗口放在适当的显示器上时,您将使用它。

-(void)windowWillEnterFullScreen:(NSNotification *)notification
{
  NSString  *mainWindowFrameString;

  // save the frame's coordinates before going full screen

  mainWindowFrameString = NSStringFromRect([_ourWindow frame]);
  [_defaults setObject:mainWindowFrameString forKey:MAIN_WINDOW_FRAME];
}

然后在viewWillAppear:判断是否需要缩放窗口(此时的窗口已经放在合适的显示器上)。 toggleFullScreen:将导致窗口全屏显示。

  lastZoomStateDefault = [_defaults objectForKey:QUITTING_ZOOM_STATE];
  _windowIsFullScreen = [lastZoomStateDefault boolValue];

  if (_windowIsFullScreen == YES) {
    [_window toggleFullScreen:nil];
    }

关于objective-c - NSWindow 自动保存 - 位置未保存在第二台显示器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30160885/

相关文章:

objective-c - NSDateFormatter localizedStringFromDate 的开销 :dateStyle:timeStyle: class method

macos - Cocoa 在特定屏幕上显示 NSWindow

macos - 在方法中间显示模态窗口

macos - 防止关闭 NSWindow 时出现保存提示

iphone - 在 Restkit (iPhone) 中使用 Json 响应

objective-c - 隐式转换为NSIndexPath的错误

iphone - 带定时器的 NSOperationQueue

objective-c - 隐藏 NSWindow 标题栏

Cocoa:插件无法打开应用程序窗口

objective-c - 全屏(信息亭)带有 WebView 的 NSWindowController 需要先单击才能单击任何链接