ライブビューを別のNSViewのように見せようとしています。2つのNSViewのレンダリングされたコンテンツをどのように同期させるべきですか?
私の問題は、ではありません。 cocoa: how to render view to image?
のは、インシデントビュー、多くの先の景色、ミラービューに1をソースビューを呼ぶことにしましょう。
すべてのビューには、エクスポートとインポートのCGLayerがあります。
エクスポートレイヤーは、インシデントビューとして機能します。
インポートレイヤーは、ミラービューとして機能します。
アイデアはインシデントビューが自分mrrSurfaceにその反射をキャッチしますncdntReflectionとそのミラービューのすべてをキャストすることです。
- ncdntReflection:インシデントビューの輸出CGLayer。
- mrrSurface:ミラービューのインポートCGLayer。
私は今のところ...
1.バッキングストアとしてCGLayer 3つのアプローチを試してみた:
- がインシデントビューとそのサブビューに内容を描きますncdntReflection。
- ドローncdntReflectionにインシデントビューの現在のコンテキスト。
- 設定ミラービュー(S) ncdntReflectionへのmrrSurface。 CGLayerへ
2.コンポジットCALayers
- ncdntReflectionへインシデントビューとそのサブビューのドローバックCALayers。
- 設定ミラービュー(S) ncdntReflectionへのmrrSurface。
3. cacheDisplayInRectまたはCGWindowListCreateImage
- キャプチャ
- がncdntReflectionにそれらの内容を描画する方法のいずれかを使用してインシデントビューの内容。
- 設定ミラービュー(S) ncdntReflectionへのmrrSurface。
私は以下の理由でこれらのアプローチのいずれも好きではありませんでした。
レイヤーの折りたたみはオプションではありません。各レイヤーにアニメーションが必要です。つまり、すべてのサブビューを取得するには、オプション1と2の両方を再帰的に実行する必要があります。私は、この種の描画のパフォーマンスが心配です。
オプション3は、実際のソリューションには長すぎます。 WPFビジュアルブラシのような -
理想的には、両方のインシデントビューとミラービューは同じレンダリング指示に従ってしまいます。
金属溶液はありますか?
メタルはこれでまったく助けになれません。 'NSView's [displayRectIgnoringOpacity:inContext:](https://developer.apple.com/reference/appkit/nsview/1483436-displayrectignoringopacity)メソッドを見ましたか? –
@SilvanMosbergerそれはまさに私が必要としていたものです!あなたがその質問に答えるなら、私はあなたにそれを信用するでしょう。 –