2011-01-18 5 views
9

전체 창을 채우고 거대한 이미지를 표시하는 NSScrollView가 있습니다. 이제 추가 정보를 표시하기 위해 스크롤 뷰의 일부 (예 : 상위 20 픽셀 높이 및 창 너비)에 사용자 정의 NSView를 오버레이하고 싶습니다. 사용자가 스크롤 뷰를 스크롤 할 때 맨 위의 사용자 정의 NSView는 그대로 있어야합니다.오버레이 NSScrollView를 통한 NSView

나는 시도 다음

  1. 가에 하위 뷰를 같이 내 사용자 정의보기를 추가
  2. 는 이전에 생성의 서브 뷰 NSView의
  3. 로 NSScrollView 추가 내 방 창문의 크기는 NSView의 인스턴스를 생성 NSView 1 단계에서

이것은 처음부터 작동합니다. 스크롤 뷰는 올바르게 표시되고 사용자 정의 NSView도 표시됩니다. 그러나 스크롤보기 (스크롤링)를 시작하자마자 NSScrollView의 내용과 함께 사용자 지정 NSView가 스크롤되고 경계 밖으로 이동 한 후 스크롤 된보기의 일부 (스크롤 된보기의 일부)가 다시 그려지면 사라집니다 . 어떻게 효과적으로 NSScrollView 위에 사용자 지정 NSView를 겹쳐 놓고 그대로 둘 수 있습니까?

감사합니다!

+0

나는 이것이 2011 년에 다시 물어 보았다는 것을 알고 있지만, 오늘 당신이 이것을 친다면 단지 힌트입니다. 당신은 모든 것을 계층화 된보기로 만듦으로써이를 해결할 수 있습니다. 그냥 단계 1에서 만든 NSView에 대해 wantsLayer를 설정합니다. 모든 자식을 재귀 적으로 백업 할 것입니다. –

답변

3

당신이 이미이 문제에 대한 해결책을 가지고 있다는 것을 알고 있습니다 만, 저는 최근에 똑같은 것을 찾고 있었고 루이 클라 센 (Lou Klaassen)의 LKOverlayWindow 클래스를 보았습니다.이 클래스는 이런 종류의 쉬운 해결책을 제공하는 것 같습니다. 위에 까는 것.

CocoaDev wiki에 설명 된대로 인터페이스 작성기에서 새 NSWindow를 만들고 LKOverlayWindow의 인스턴스로 만들고 콘센트를 통해 NSScrollView를 연결하거나 코드에서 지정해야합니다. 스크롤 뷰에 연결되면 LKOverlayWindow의 내용이 스크롤 뷰를 오버레이하고 이동하면서 크기가 조정됩니다 (후자는 NSSTrollView를 창 콘센트로 사용하는 것처럼 보임). 샘플 프로젝트는 저자 here에 의해 제공됩니다.

NSScrollView를 서브 클래 싱하는 방법을 찾아야했지만, 내 경우에는 훨씬 쉬워졌습니다.

+0

아주 좋습니다, 다음 번에 사용하겠습니다. 그것을 공유해 주셔서 감사합니다! – Robin

9

두 가지 옵션이 있습니다.

먼저 "Copy on Scroll"을 해제하십시오. IB에서 직접 또는 NSScrollViewcontentView 구성원에 copiesOnScroll 옵션을 설정하여이 작업을 직접 수행 할 수 있습니다. 기본적으로 켜져있는이 옵션을 사용하면 스크롤 뷰가 "스크롤하는 동안 기존 렌더링 된 이미지를 복사합니다 (문서 뷰의 노출 된 부분 만 그리기"). 해제하면 "매번 내용이 다시 그려집니다." 따라서 성능이 큰 문제가 아닌 경우에는 성능을 해제해야합니다.

그러나 스크롤보기 내에서 복잡한 그림을 그리는 경우 콘텐츠를 매번 다시 그리기하면 주요 성능 문제가 발생할 수 있습니다.

두 번째 옵션은 "Copy on Scroll"을 켠 상태에서 오버레이보기가 포함 된 경계선없는 창을 만드는 것입니다. 실제로는 NSWindow 인스턴스를 현재 창의 하위 노드로 추가 할 수 있으므로 소리가 들릴 정도로 위험하지는 않습니다. 따라서 이동했을 때 기본 창과 함께 자동으로 이동합니다.

샘플 RoundTransparentWindow 샘플은 오버레이가 포함될 창을 만드는 훌륭한 예를 보여줍니다. 그런 다음 NSWindow의 addChildWindow을 사용하여 기본 창에 첨부하십시오.

이 방법을 사용하면 오버레이 창의 표시 및 숨기기 타이밍을 처리해야합니다. 또한 부모 창을 최대화 할 때 하위 창 위치가 자동으로 조정되지 않는 경우가있는 것으로 보입니다. 그래서, 당신도 그것을 처리해야합니다. 그러나 "Copy on Scroll"을 사용할 때 때로는 엄청난 성능 향상을 희생하기를 원하지 않으면 훌륭한 솔루션입니다.

+1

해결해 주셔서 감사합니다. 문제가 해결되었습니다. 그러나 처음에는 서브 윈 도우 버전에 상당한 결점이 있다고 말했듯이 해결책을 얻었습니다. 더 쉬운 방법은 NSScrollView를 서브 클래스 화하고 거기에 서브 뷰를 추가하는 것입니다. 이제는 내가 쓴 덮어 쓰기 된 reflectScrolledClipView 구현에서 내 하위 뷰의 위치를 ​​조정할 수 있었고, 완벽하게 작동했습니다. – Robin

+1

아, 아주 좋은 해결책입니다. 그건 분명히 당신의 유스 케이스를위한 최상의 솔루션입니다. 제 경우에는 스크롤 뷰를 부분적으로 만 겹쳐서 내부에 그릴 수없는 뷰가 필요했습니다. 서브 윈도우 접근법을 사용해야했습니다. –