ドックの位置を変更すると、Cocoa は NSApplicationDidChangeScreenParametersNotification を起動します。
問題は、Apple Docsに関しては、次の場合にのみ発生させる必要があることです。
コンピューターに接続されているディスプレイの構成が変更されたときに投稿されます。構成の変更は、プログラムによって行うことも、ユーザーが [ディスプレイ] コントロール パネルで設定を変更したときに行うこともできます。通知オブジェクトは sharedApplication です。この通知には userInfo ディクショナリが含まれていません。
そのため、新しいディスプレイを接続するときにアプリケーション ウィンドウを更新する場合 (たとえば、HUD ウィンドウのフレームを変更/移動するなど)、ドックに偽の通知が送信されます。また、この通知には userInfo ディクショナリが添付されていないため、ドックまたは新しいディスプレイ コントローラーを確認する機会がありませんでした。
では、これをどのように処理しますか?
考えられる解決策は、通知が発生したときに [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
}