对NSDrawer的contentView进行子类化以实现完全自定义的抽屉

时间:2011-02-01 22:22:31

标签: objective-c cocoa macos nsview

我想通过继承NSView并在其中完成我的所有视图绘图来完全实现我自己的自定义抽屉。我已经创建了一个自定义的NSView类,除了实现initWithFrame和drawRect之外几乎没有任何东西:我已经记录了NSView的框架/边界(正确报告)。我还实例化了这个视图,并使用setContentView将它添加到我的应用程序中的NSDrawer对象:所以它使用我的自定义NSView。

但是,这仍然会绘制一个附加到我的应用程序NSWindow边缘的默认抽屉布局。如何覆盖此默认样式,以便我可以在我的自定义子类NSView中绘制自己的抽屉(!),而不会在操作系统中绘制任何默认值? (这样我就可以自己控制抽屉的设计和尺寸,基本上模拟一个不会严格像传统抽屉一样的标签栏。)

2 个答案:

答案 0 :(得分:1)

抽屉的框架视图正在绘制该框架。为此,您需要使用一些私有方法,最简单的方法可能是使用NSDrawer的自定义子类。我不知道抽屉使用的具体方法,但您可以使用class-dump获取包含私有方法的类的标题。

编辑:这就是NSDrawer实际做的事情。

NSDrawer是一个管理其他对象的不透明对象。它使用私有NSDrawerWindow类创建一个窗口。设置其内容视图可设置窗口的内容视图。 NSDrawerWindow类使用私有NSDrawerFrame类(它是私有NSFrameView类的子类)作为其背景,并在其中显示其内容视图。

要更改框架,您需要一种方法来更改窗口中的框架视图。最简单的方法是获取NSDrawerWindow的标头并添加一个覆盖+frameViewClassForStyleMask:的类别以返回自定义视图的类。您的自定义视图应该是NSFrameView的子类,这意味着您还需要该类的标题。

答案 1 :(得分:1)

我通过继承NSWindow而不是NSDrawer创建了一个自定义抽屉。这是很多工作。有一个私有对象NSThemeFrame,位于NSWindow及其contentView之间。为避免使用私有API,您必须创建一个透明窗口,并让其contentView充当NSThemeFrame。 Matt Gallagher展示了如何:http://cocoawithlove.com/2008/12/drawing-custom-window-on-mac-os-x.html