13

现在似乎越来越多的 OS X 应用程序正在为自定义控件做各种花哨的绘图工作。Twitterific、Things、EventBox、Versions 等应用程序仅举几例......

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

任何帮助是极大的赞赏。谢谢!

4

2 回答 2

25

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

例如,版本中的“显示原始属性”按钮是一个 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
}

Versions 中的 Timeline 视图实际上是一个 WebView,您在其中看到的页面使用 javascript 折叠您单击的标题。

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

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

学习如何在自定义视图的绘制方法中绘制东西的推荐阅读:Cocoa 绘图指南

例如,自定义 NSTableView 的外观完全是另一回事,由于 tableview 的复杂性,这种情况可能随处可见。您将为您想要在表格中执行的某些操作实现自己的自定义单元格,但必须更改在实际 NSTableView 对象本身的子类中突出显示行的方式。例如,请参阅Matt Gemmell 网站上的 iTableView 的源代码,了解在哪里绘制什么的清晰示例。

最后,我认为 Abizer 建议去查看 BWToolkit 的代码是个好主意。一开始可能有点不知所措,但如果您能够阅读并理解该代码,那么您在实现自己的自定义视图和控件时就不会遇到麻烦。

于 2008-12-19T13:46:25.537 回答
3

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

于 2008-12-19T12:52:50.433 回答