以编程方式同时缩小一组 NSWindows?
Simultaneously deminiaturize an array of NSWindows programmatically?
在 Cocoa (Objective-C) 中,如何在不使用后台线程的情况下 以编程方式同时缩小一组 NSWindow 实例的小型化?
如果您在 NSWindow 实例上调用 'deminiaturize:',它将在去小型化过程期间(大约 0.3 秒)阻塞主线程。如果您指示 windows 数组去小型化,它们将一次一个地执行,累积起来需要相当长的时间,并且一直阻塞主线程。可以使用后台线程实现所需的效果,但这(正确地)会引发控制台日志错误。
能够在 0.3 秒或更短时间内安全地使一组 5 人以上 windows 小型化的能力是理想的。有没有办法从缩小化中删除动画以加快该过程?有没有另一种方法可以在不调用 'deminiaturize:' 的情况下将 windows 恢复到屏幕?
通过使用 setReleasedWhenClosed:
、close
和 makeKeyAndOrderFront:
的组合,可以在没有任何动画(即立即)的情况下有效地缩小 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。)
在 Cocoa (Objective-C) 中,如何在不使用后台线程的情况下 以编程方式同时缩小一组 NSWindow 实例的小型化?
如果您在 NSWindow 实例上调用 'deminiaturize:',它将在去小型化过程期间(大约 0.3 秒)阻塞主线程。如果您指示 windows 数组去小型化,它们将一次一个地执行,累积起来需要相当长的时间,并且一直阻塞主线程。可以使用后台线程实现所需的效果,但这(正确地)会引发控制台日志错误。
能够在 0.3 秒或更短时间内安全地使一组 5 人以上 windows 小型化的能力是理想的。有没有办法从缩小化中删除动画以加快该过程?有没有另一种方法可以在不调用 'deminiaturize:' 的情况下将 windows 恢复到屏幕?
通过使用 setReleasedWhenClosed:
、close
和 makeKeyAndOrderFront:
的组合,可以在没有任何动画(即立即)的情况下有效地缩小 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。)