1

当更改停靠位置时,Cocoa 会触发 NSApplicationDidChangeScreenParametersNotification:

问题是对于Apple Docs,只有在

当连接到计算机的显示器的配置发生更改时发布。配置更改可以通过编程方式进行,也可以在用户更改显示控制面板中的设置时进行。通知对象是 sharedApplication。此通知不包含 userInfo 字典。

因此,如果您想在附加新显示器时更新您的应用程序窗口(例如更改/移动某些 HUD 窗口/等的框架),您将收到一个虚假的通知。此通知也没有附加 userInfo 字典,因此我没有机会检查扩展坞或新显示控制器的时间。

那么如何处理呢?

一种可能的解决方案是在通知 si 触发时检查 [NSScreen mainScreen] 大小。如果此 NSSize 发生更改,则该通知来自附加的新显示器,而不是来自扩展坞:

static NSSize mainScreenSize;

-(void)handleApplicationDidChangeScreenParameters:(NSNotification *)notification {


    NSSize screenSize = [[NSScreen mainScreen] frame].size;


    if( screenSize.width != mainScreenSize.width || screenSize.height != mainScreenSize.height ) { // screen size changed

        mainScreenSize =  [[NSScreen mainScreen] frame].size;
        [myWindowController updateContent];
        [[myWindow contentView] setNeedsDisplay:YES]; // update custom window

}
4

1 回答 1

4

通知被触发是因为主屏幕visibleFrame(不包括 Dock 占用的空间)取决于 Dock 的位置。

因此,如果visibleFrame主屏幕的 改变,您可以确定通知是 Dock 被移动的结果。

于 2011-10-26T11:18:04.063 回答