[Obj-C++] 17 NSWindowの重複 : 解決手順改良

[M1 Mac, Big Sur 11.6.5, clang 13.0.0, no Xcode]

前回の続きです。

前の記事で紹介した方法では、新しいNSWindowの位置がおまかせなので環境によってはピョンと飛んだ感じになり見栄えが良くないです。

微動だにしないようにするには以下のコードになります。

参考にさせていただいたサイトのことは前から知っていましたが、今回かなり役に立ちました。

<該当箇所のみ>

@implementation DragAndDropView

// ドロップ完了後の処理
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender{
    NSPasteboard *pboard = [sender draggingPasteboard];
    NSString *fileURL = [[NSURL URLFromPasteboard:pboard] path];
    NSLog(@"fileURL %@",fileURL);

    // NSAppのWindowをディスプレイ表示順に並べた配列を作成
    NSArray *windowsArray = [NSApp orderedWindows];
    NSLog(@"windowsArray %@", windowsArray);

    // 先頭のWindowを選択(操作しているため、このAppが常に先頭)
    NSWindow *currentWindow = [windowsArray objectAtIndex:0];

    // Windowのスクリーン座標を取得し、原点となる左下座標のNSPointを作成
    NSRect contentRect = [currentWindow frame];
    float x = NSMinX(contentRect);
    float y = NSMinY(contentRect);
    NSPoint xy = NSMakePoint(x, y);

    // Windowを非表示にする
    [currentWindow setIsVisible:NO];

    //新たにAppのWindowを作成
    ConvertorWindow *newWindow = [[ConvertorWindow alloc] init];
    [[newWindow autorelease] makeMainWindow];

    // Windowを元の位置に配置
    [newWindow setFrameOrigin:xy];
}
@end

参考記事1
参考記事2