在可可(Objective-C)中,如何在不使用后台线程的情况下以编程方式同时使一组NSWindow实例小型化?
如果在NSWindow实例上调用“ deminiaturize:”,它将在去小型化过程的持续时间内(约0.3秒)阻塞主线程。如果您指示一组窗口缩小以使其小型化,则它们将一次执行一次,累计花费相当长的时间,始终阻塞主线程。可以使用后台线程来实现所需的效果,但这(正确)会引发控制台日志错误。
在0.3秒或更短的时间内安全地使5个以上的窗口组小型化的能力将是理想的。是否有办法从小型化中删除动画以加快处理过程?是否有另一种方法可以将窗口还原到屏幕而无需调用“ deminiaturize:”?
最佳答案
通过使用setReleasedWhenClosed:
,close
和makeKeyAndOrderFront:
的组合,可以有效地使NSWindows数组小型化,而无需任何动画(即即刻进行)-并且无需实际取消分配对象。
目标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];
}
}
}
迅速:
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:
,以避免更改键窗口。 (尽管makeKeyAndOrderFront的行为复制了deminiaturize:
的行为,这导致该窗口成为关键窗口。)