以编程方式同时缩小一组 NSWindows?

Simultaneously deminiaturize an array of NSWindows programmatically?

在 Cocoa (Objective-C) 中,如何在不使用后台线程的情况下 以编程方式同时缩小一组 NSWindow 实例的小型化?

如果您在 NSWindow 实例上调用 'deminiaturize:',它将在去小型化过程期间(大约 0.3 秒)阻塞主线程。如果您指示 windows 数组去小型化,它们将一次一个地执行,累积起来需要相当长的时间,并且一直阻塞主线程。可以使用后台线程实现所需的效果,但这(正确地)会引发控制台日志错误。

能够在 0.3 秒或更短时间内安全地使一组 5 人以上 windows 小型化的能力是理想的。有没有办法从缩小化中删除动画以加快该过程?有没有另一种方法可以在不调用 'deminiaturize:' 的情况下将 windows 恢复到屏幕?

通过使用 setReleasedWhenClosed:closemakeKeyAndOrderFront: 的组合,可以在没有任何动画(即立即)的情况下有效地缩小 NSWindows 数组的小型化 - 而且实际上没有取消分配对象。

Objective-C:

void deminiaturizeWindowsWithoutAnimation(NSArray<NSWindow *> *windows) {
    for (NSWindow * window in windows) {
        if ([window isMiniaturized]) {
            BOOL old_isReleasedWhenClosed = [window isReleasedWhenClosed];
            [window setReleasedWhenClosed:false];
            [window close];
            [window makeKeyAndOrderFront: nil];
            [window setReleasedWhenClosed:old_isReleasedWhenClosed];
        }
    }
}

Swift:

func deminiaturizeWithoutAnimation(windows: [NSWindow]) {
    for window in windows {
        guard window.isMiniaturized else { continue }
        let old_isReleasedWhenClosed = window.isReleasedWhenClosed
        window.isReleasedWhenClosed = false
        window.close()
        window.makeKeyAndOrderFront(nil)
        window.isReleasedWhenClosed = old_isReleasedWhenClosed
    }
}

这些函数可以从主线程调用。在 macOS Sierra 上测试。

如果您愿意,可以将 makeKeyAndOrderFront: 替换为 orderFront:orderBack: 以避免更改密钥 window。 (尽管 makeKeyAndOrderFront 的行为复制了 deminiaturize: 的行为,这导致 window 成为键 window。)