当更改停靠位置时,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
}