2011-02-01 6 views
2

NSView를 서브 클래 싱하고 그 안에 모든 뷰 그리기를 수행하여 내 자신 만의 서랍을 완벽하게 구현하고 싶습니다. 나는 initWithFrame :과 drawRect : 구현하는 것과 별개로 거의 아무것도하지 않는 커스텀 NSView 클래스를 만들었다. NSView의 프레임/경계를 로깅하고있다. 또한이 뷰를 인스턴스화하여 setContentView를 사용하여 응용 프로그램의 NSDrawer 객체에 추가했습니다. 따라서 사용자 정의 NSView가 사용됩니다.NSDrawer의 contentView를 서브 클래 싱하여 완전히 맞춤형 서랍을 구현하십시오.

그러나 이것은 여전히 ​​내 응용 프로그램 NSWindow의 가장자리에 첨부 된 기본 서랍 레이아웃을 그립니다. 이 기본 스타일을 어떻게 오버라이드하여 OS에 의해 그려지는 기본 설정없이 내 사용자 정의 서브 클래 싱 된 NSView에 내 서랍 (!)을 그릴 수 있습니까? (기본적으로 서랍의 디자인과 크기를 직접 제어 할 수 있으므로 기본적으로 기존 서랍처럼 작동하지 않는 탭 막대를 에뮬레이션합니다.)

답변

1

해당 프레임은 드로어의 프레임보기에서 그려집니다. 이렇게하려면 몇 가지 전용 메서드를 사용해야하며 가장 쉬운 방법은 NSDrawer의 사용자 지정 하위 클래스를 사용하는 것입니다. 서랍에 사용 된 구체적인 방법을 모르지만 class-dump을 사용하는 개인용 메서드를 포함한 클래스의 머리글을 얻을 수 있습니다.

편집 : 이것은 NSDrawer가 실제로하는 일입니다.

NSDrawer는 다른 개체를 관리하는 불투명 한 개체입니다. 그것은 개인 NSDrawerWindow 클래스를 사용하여 창을 만듭니다. 내용보기를 설정하면 창의 내용보기가 설정됩니다. NSDrawerWindow 클래스는 비공개 NSFrameView 클래스의 서브 클래스 인 private NSDrawerFrame 클래스를 배경으로 사용하고 그 안에 내용보기를 표시합니다.

프레임을 변경하려면 창에서 프레임보기를 변경해야합니다. 가장 쉬운 방법은 NSDrawerWindow의 머리글을 가져오고 +frameViewClassForStyleMask:을 재정의하는 범주를 추가하여 사용자 지정보기의 클래스를 반환하는 것입니다. 사용자 정의보기는 NSFrameView의 하위 클래스 여야합니다. 즉, 해당 클래스의 헤더도 필요합니다.

+0

가능한 경우 개인적인 방법의 사용을 피하고 싶습니다. NSDrawer를 서브 클래 싱하고 내 프레임을 구현하여 어느 정도까지 얻을 수 있는지 살펴 보겠습니다. 서랍과 같이 NSView를 윈도우 가장자리에 "첨부"할 수있는 방법이 있나요? 자동으로 크기가 조정되지만 NSDrawer를 서브 클래 싱하지 않고 자신 만의 뷰를 그릴 수 있습니까? – WheresWardy

+0

내 게시물에 NSDrawer가 수행하는 작업에 대한 설명을 추가하겠습니다. 기본적으로 다양한 클래스의 하위 클래스를 만들거나 구현을 처음부터 새로 만들 수 있습니다. – ughoavgfhw

1

NSDrawer 대신 NSWindow를 서브 클래 싱하여 맞춤형 서랍을 만들었습니다. 그것은 많은 일이었습니다. NSWindow와 contentView 사이에있는 전용 객체 인 NSThemeFrame이 있습니다. 비공개 API를 사용하지 않으려면 투명 윈도우를 만들고 contentView를 NSThemeFrame처럼 작동시켜야합니다. Matt Gallagher는 다음과 같은 방법을 보여줍니다. http://cocoawithlove.com/2008/12/drawing-custom-window-on-mac-os-x.html

관련 문제