现在似乎越来越多的 OS X 应用程序正在为自定义控件做各种花哨的绘图工作。Twitterific、Things、EventBox、Versions 等应用程序仅举几例......
所以基本上我正在寻找有关如何开始做这种事情的任何信息。不确定它是否只是通过子类化控件和使用自定义绘图来完成,或者它是否完全不同。
任何帮助是极大的赞赏。谢谢!
现在似乎越来越多的 OS X 应用程序正在为自定义控件做各种花哨的绘图工作。Twitterific、Things、EventBox、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
}
Versions 中的 Timeline 视图实际上是一个 WebView,您在其中看到的页面使用 javascript 折叠您单击的标题。
我用于从哪里开始使用自定义控件的经验法则是:
学习如何在自定义视图的绘制方法中绘制东西的推荐阅读:Cocoa 绘图指南
例如,自定义 NSTableView 的外观完全是另一回事,由于 tableview 的复杂性,这种情况可能随处可见。您将为您想要在表格中执行的某些操作实现自己的自定义单元格,但必须更改在实际 NSTableView 对象本身的子类中突出显示行的方式。例如,请参阅Matt Gemmell 网站上的 iTableView 的源代码,了解在哪里绘制什么的清晰示例。
最后,我认为 Abizer 建议去查看 BWToolkit 的代码是个好主意。一开始可能有点不知所措,但如果您能够阅读并理解该代码,那么您在实现自己的自定义视图和控件时就不会遇到麻烦。
看看一些优秀的示例代码:BWToolkit