2016-07-29 10 views
0

라이브 뷰어을 다른 NSView의 모습으로 표시하려고합니다.두 NSView의 렌더링 된 내용을 어떻게 동기화해야합니까?

내 문제 은 (는)이 아니므로보기를 이미지로 렌더링하지 않습니다.


cocoa: how to render view to image?은의 소스보기, 사건보기, 많은 대상 뷰에 하나, 거울보기를 부르 자.

모든보기에는 내보내기 및 가져 오기 CGLayer가 있습니다.

내보내기 계층은 인시던트보기의 역할을합니다.

가져 오기 레이어는 미러보기의 역할을합니다.

아이디어는 사건보기mrrSurface에 그 반사를 잡을 것 ncdntReflection거울보기의 모든 캐스팅 것입니다.

  • ncdntReflection : 사고 뷰의 수출 CGLayer.
  • mrrSurface : 미러보기의 가져 오기 CGLayer.

나는 백업 저장소로 지금까지 3 개 방식 ...

1 CGLayer 시도했다 : 사건보기

  1. 그리기 내용과 파단에를 ncdntReflection.
  2. 그리기 ncdntReflection into 인시던트보기의 현재 컨텍스트.
  3. 설정 거울보기 (들) ncdntReflection의 mrrSurface. CGLayer에

2. 복합 CALayers

  1. ncdntReflection사건보기와 서브 뷰의 그리기 백업 CALayers.
  2. 설정 거울보기 (들) ncdntReflection의 mrrSurface.

3. cacheDisplayInRect 또는 CGWindowListCreateImage

  1. 캡처
  2. ncdntReflection에 그 내용을 그리기 방법을 사용하여 사건보기의 내용.
  3. 설정 거울보기 (들) ncdntReflection의 mrrSurface.

다음과 같은 이유로 이러한 접근 방식이 마음에 들지 않았습니다.

레이어 축소는 각 레이어마다 애니메이션이 필요하기 때문에 옵션이 아닙니다. 즉, 모든 하위 뷰를 가져 오기 위해서는 옵션 1과 2 모두 재귀 적이어야합니다. 이런 종류의 드로잉에서 성능이 떨어질 까봐 걱정됩니다.

옵션 3은 실제 솔루션으로는 너무 오래 걸립니다. WPF 비주얼 브러쉬와 같은 -

이상적으로 모두 사건보기거울보기 같은 렌더링 지침을 따를 것입니다.

금속 용액이 있습니까?

+0

금속이 전혀 도움이되지 못합니다. NSView의 [displayRectIgnoringOpacity : inContext :] (https://developer.apple.com/reference/appkit/nsview/1483436-displayrectignignoringopacity) 메소드를 보셨습니까? –

+0

@SilvanMosberger 그게 내가 필요한 것입니다! 당신이 질문에 대답하면 나는 당신에게 그것을 신용해야합니다. –

답변

1

아마 당신은 NSView s displayRectIgnoringOpacity:inContext: 방법을 찾고 있습니다. 보기를 두 번 그리기 때문에 가장 효율적인 방법이 아닐 수도 있지만 귀하의 경우에는 효과가있는 것 같습니다. 반면에 더 많은 메모리를 필요로하는 픽셀 버퍼를 캐시하는 것이 더 빠른지 확실하지 않습니다.