2016-09-23 5 views
1

Cocoa(Objective-C)では、どのようにしてのバックグラウンドスレッドを使用せずに、NSWindowインスタンスのグループをプログラムで同時に完全に無精化できますか?NSWindowの配列をプログラムで同時に分解しますか?

NSWindowインスタンスで 'deminiaturize:'を呼び出すと、スマートプロセスの期間(約0.3秒)にメインスレッドがブロックされます。あなたが消滅させるウィンドウの配列を指示するなら、それらは一度に一つずつ行い、累積的にかなりの時間がかかり、常にメインスレッドをブロックします。バックグラウンドスレッドを使用して目的の効果を達成できますが、これは(正しく)コンソールログエラーをスローします。

0.3秒以内に5つ以上のウィンドウのグループを安全に消滅させる機能が理想的です。プロセスをスピードアップするために、アニメーションを除去する方法はありますか? 'deminiaturize:'と呼ばずにウィンドウを画面に復元する別の方法はありますか? setReleasedWhenClosed:close、及びmakeKeyAndOrderFront:の組み合わせを使用することにより

+0

ドックは超小型化を行っています。スケール効果はより速くなります。スローモーションのシフトキーを押します。 – Willeke

+0

'close'は' releasedWhenClosed'がfalseの場合、ウィンドウを解放しません。 – Willeke

答えて

2

、(すなわち、瞬時に)効果的に任意のアニメーションなしNSWindowsのアレイをdeminiaturizeすることが可能である - 実際のオブジェクトを解放せず。

の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]; 
     } 
    } 
} 

スウィフト:

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:のものを複製します。その結果、ウィンドウがキーウィンドウになります)。

+1

これはすばらしい答えです。私は、ウィンドウコントローラとウィンドウデリゲートを保存して再構築し、NSWindowWillCloseNotificationをインターセプトしなければなりませんでした。また、macOS 10.12の新しいタブ付きウィンドウは、この解決策を使用してグループを解除します...しかし、すべて私はそれを感謝する必要があります! –

+0

素晴らしい点。 「deminiaturize:」という仕組みを掘り下げて、NSWindowと私的なCoreDockフレームワークの私的な内部を作り出しました。ドック内のウィンドウを取り除いてから再表示する方法は、内部のNSWindowsセレクタをスウィズルする方法や、そのプライベートフレームワークを使う方法(Mac App Storeと互換性がありません。将来のOSリリースで破損する可能性が高い - この方法はかなり安全です)。 – breakingobstacles

関連する問題