寻找有关界面组件的自定义绘图的信息(Cocoa)

时间:2008-12-19 12:46:17

标签: objective-c cocoa macos interface-builder

现在越来越多的OS X应用程序似乎正在为自定义控件做各种精美的绘图工作。像Twitterific,Things,EventBox,Versions这样的应用只是举几个......

所以基本上我正在寻找有关如何开始做这种事情的任何信息。不确定它是否只是通过子类化控件和使用自定义绘图来完成,或者它是否完全不同。

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:25)

这完全取决于你想做什么。

例如,Versions中的“显示原始属性”按钮是一个NSButton子类,因为基本上我们需要的是具有我们自己外观的标准按钮行为。子类化按钮的一种方法是在NSButton子类中简单地实现你自己的-drawRect:(NSRect)rect方法,但是我们决定坚持在Cocoa中实现NSButton的方式,这意味着大多数绘图是由按钮的单元格完成的,所以实现看起来像这样:

在NSButton子类中:

+ (Class) cellClass
{
    return [OurButtonCell class];
}

- (void)drawRect:(NSRect)rect 
{
    // first get the cell to draw inside our bounds
    // then draw a focus ring if that's appropriate
}

在NSButtonCell子类(OurButtonCell)中:

- (void)drawInteriorWithFrame: (NSRect) rect inView: (NSView *) controlView
{
    // a bunch of drawing code
}

版本中的时间轴视图实际上是一个WebView,您在其中看到的页面使用javascript来折叠您单击的标题。

我用于从哪里开始使用自定义控件的经验法则是:

  • 要自定义标准Cocoa控件的外观:
    • 继承适当的控件(例如NSButton和NSButtonCell)
    • 尽可能接近默认控件的实现方式(例如,在一个按钮单元格中,从现有的attributesTitle实例方法开始绘制按钮标题,除非您总是想要使用相同的属性进行绘制,而不管是什么设置在IB中或者您需要根据状态绘制不同的属性,例如在版本的主窗口中使用试用过期按钮)
  • 创建一个全新的UI元素:
    • 子类NSView并实现几乎所有鼠标和键事件处理(在视图中,不需要重做“hitTest:”)并自己绘制代码。
  • 呈现复杂,任意高度但不是桌子的东西:
    • 看看你是否可以在HTML,CSS和JS中完成它并将它呈现在WebView中。网络非常适合布置文本,所以如果你可以将这个责任转移到你的WebView上,这可以大大节省颈部疼痛。

关于学习如何在自己的自定义视图的绘图方法中绘制内容的推荐阅读:Cocoa Drawing Guide

由于桌面视图的复杂性,自定义NSTableView的外观是完全另外一杯茶,可以在整个地方发生。您将为要在表中执行的某些操作实现自己的自定义单元格,但必须更改在实际NSTableView对象本身的子类中突出显示行的方式。例如,参见Matt Gemmell's site上的iTableView的源代码,以获得绘制内容的明确示例。

最后,我认为Abizer建议去看看BWToolkit的代码是一个好主意。一开始可能有点压倒性,但如果您能够阅读并理解该代码,那么您可以毫不费力地实现自己的自定义视图和控件。

答案 1 :(得分:3)

看看一些优秀的示例代码:BWToolkit