2016-07-29 124 views
0

我試圖展示一個活的視覺什麼是另一個NSView的樣子。我應該如何同步兩個NSView的渲染內容?

我的問題不是將視圖渲染爲圖像。 cocoa: how to render view to image?


讓我們把源代碼視圖,事件視圖和一對多目的地觀點,鏡像區域

每個視圖都有一個導出和導入CGLayer。

導出圖層將使其充當事件視圖

導入圖層將使其充當Mirror View

的想法是,事件視圖會施放一個ncdntReflection及其所有鏡像區域將趕上反思自己mrrSurface

  • ncdntReflection:事件視圖的導出CGLayer。
  • mrrSurface:鏡像視圖的導入CGLayer。

我試過3種方法至今...

1 CGLayer作爲後備存儲:

  1. 事件視圖繪製內容及其子視圖到ncdntReflection
  2. Draw ncdntReflection into Incident View的當前上下文。
  3. 套裝鏡觀(S)ncdntReflection mrrSurface

2.複合CALayers到CGLayer

  1. 事件視圖及其子視圖繪製後盾CALayers到ncdntReflection
  2. 套裝鏡觀(S)ncdntReflection mrrSurface

3 cacheDisplayInRect或CGWindowListCreateImage

  1. 捕捉使用這兩種方法
  2. 繪製這些內容進入ncdntReflection事件視圖的內容。
  3. 套裝鏡觀(S)ncdntReflection mrrSurface

由於以下原因,我不喜歡這些方法。

Collapsing Layers不是一個選項,因爲我需要在每個圖層上的動畫。這意味着選項1和2都必須遞歸才能獲得所有的子視圖。我很擔心這種繪圖的性能受到影響。

選項3只是太長時間才能成爲現場解決方案。

理想既事件視圖鏡像區域將遵循同樣呈現指令 - 就像一個WPF視覺畫筆。

是否有金屬解決方案?

+0

金屬不能完全幫助你。你看過'NSView' [displayRectIgnoringOpacity:inContext:](https://developer.apple.com/reference/appkit/nsview/1483436-displayrectignoringopacity)方法嗎? –

+0

@SilvanMosberger這正是我需要的!如果你回答這個問題,我一定會相信你的。 –

回答

1

可能您正在尋找NSView s displayRectIgnoringOpacity:inContext:方法。它可能不是最有效的方法,因爲它可以兩次繪製視圖,但它似乎適用於您的情況。另一方面,我不確定是否會更快地緩存像素緩衝區,無論如何需要更多的內存。