4

iWork と同じウィンドウ フリッピングを実装しようとしています -

https://dl.dropbox.com/u/2338382/Window%20Flipping.mov

ただし、これを行う簡単な方法を見つけることができないようです。一部のチュートリアルでは、ウィンドウの両側のスナップショット画像をより大きな透明なウィンドウに貼り付け、それらをアニメーション化することを提案しています。これは機能する可能性がありますが、少しハッキリしているようで、サンプル コードは常に肥大化しています。一部のチュートリアルではプライベート API の使用が推奨されていますが、このアプリは MAS に縛られている可能性があるため、それは避けたいと考えています。

これを実装するにはどうすればよいですか?誰にもヒントはありますか?

NSWindow+フリッピング

以下にリンクされている古いコードを NSWindow+Flipping に書き直しました。これらのソース ファイルは、mymisc から取得できます。GitHub 上の Cocoa コレクション、PCSnippets

4

1 に答える 1

4

これは、 CoreGraphics フレームワークを使用して実現できます。これを見てください:

- (void) flipWithDuration: (float) duration forwards: (BOOL) forwards
{
  CGSTransitionSpec spec;
  CGSTransitionHandle transitionHandle;
  CGSConnection cid = CGSDefaultConnection;

  spec.type = CGSFlip;
  spec.option = 0x80 | (forwards ? 2 : 1);
  spec.wid = [self windowNumber];
  spec.backColor = nil;

  transitionHandle = -1;
  CGSNewTransition (cid, &spec, &transitionHandle);
  CGSInvokeTransition (cid, transitionHandle, duration);
  [[NSRunLoop currentRunLoop] runUntilDate: 
        [NSDate dateWithTimeIntervalSinceNow: duration]];
  CGSReleaseTransition (cid, transitionHandle);
}

サンプル プロジェクトはこちらからダウンロードできます。詳細はこちら

アップデート:

このプロジェクトを見てください。それは実際にあなたが必要とするものです。

このプロジェクトについて:

このカテゴリをオンにNSWindowすると、ダッシュボード ウィジェットで普及している「フリップ」アニメーションを使用して、あるウィンドウを別のウィンドウに切り替えることができます。これは、CoreImage とそれを Cocoa で使用する方法について学ぶ良い口実でした。デモアプリは、その使用方法を示しています。最後までスクロールして、このバージョンの新機能を確認してください!

基本的に、あなたがする必要があるのは次のようなものです:

[someWindow flipToShowWindow:someOtherWindow forward:YES];

ただし、このコードはいくつかの前提を置いています。 — someWindow (最初のウィンドウ) は既に画面に表示されています。— someOtherWindow (最後のウィンドウ) はまだ画面に表示されていません。— どちらのウィンドウも同じサイズにサイズ変更でき、大きすぎたり複雑すぎたりすることはありません — 後者の条件は、CPU/ビデオ カードが高速であるほど重要ではなくなります。— アニメーションの実行中にウィンドウが消えません。— ユーザーは、アニメーション ウィンドウをクリックしたり、アニメーションの実行中に何かを実行したりしません。

実装は非常に簡単です。最終ウィンドウを最初のウィンドウと同じ位置とサイズに移動します。次に、そのフレームを覆うように、より大きな透明なウィンドウを配置します。両方のウィンドウ コンテンツを CIImages にレンダリングし、両方のウィンドウを非表示にして、アニメーションを開始します。アニメーションの各フレームは、遠近法で歪んだイメージを透明なウィンドウにレンダリングします。アニメーションが完成したら、最終的なウィンドウを表示します。これを高速化するためにいくつかのトリックが使用されます。反転ウィンドウは一度だけ設定されます。たとえば、最後のウィンドウは、アルファを 0.0 に設定することによって非表示になります。

主なボトルネックは CoreImage フィルターであり、最初のフレームのレンダリングには常に、残りのフレームの 4 ~ 6 倍の時間がかかります。この時間は、セットアップとビデオ カードへのダウンロードに費やされていると思います。そこで時間を計算し、回転が見え始めた段階で2コマ目を描画します。アニメーションはこの時点で開始されますが、最初の 2 つのフレームに時間がかかりすぎた場合は、継続時間を延長して、少なくともあと 5 フレームがレンダリングされるようにします。これは、遅いハードウェアまたは大きなウィンドウで発生します。最後に、最後のフレームをまったくレンダリングせず、代わりに最後のウィンドウをスワップします。

于 2012-07-03T14:33:10.217 に答える