【问题标题】:Subclassing an NSDrawer's contentView to implement a completely custom drawer子类化 NSDrawer 的 contentView 以实现完全自定义的抽屉
【发布时间】:2011-06-19 14:42:13
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c cocoa macos nsview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      编辑:这就是 NSDrawer 的实际作用。

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

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

      【讨论】:

      • 如果可以的话,我想避免使用私有方法。我将尝试继承 NSDrawer 并实现我自己的框架,看看我能走多远。有没有办法让 NSView 像抽屉一样“附加”到窗口边缘,自动调整大小,但允许您绘制自己的视图,而无需大惊小怪地继承 NSDrawer?
      • 我将在我的帖子中添加对 NSDrawer 所做工作的描述。基本上,您的选择是子类化各种类或从头开始创建您的实现。
      猜你喜欢
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      相关资源
      最近更新 更多