现在越来越多的OS X应用程序似乎正在为自定义控件做各种精美的绘图工作。像Twitterific,Things,EventBox,Versions这样的应用只是举几个......
所以基本上我正在寻找有关如何开始做这种事情的任何信息。不确定它是否只是通过子类化控件和使用自定义绘图来完成,或者它是否完全不同。
非常感谢任何帮助。谢谢!
答案 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 Drawing Guide
由于桌面视图的复杂性,自定义NSTableView的外观是完全另外一杯茶,可以在整个地方发生。您将为要在表中执行的某些操作实现自己的自定义单元格,但必须更改在实际NSTableView对象本身的子类中突出显示行的方式。例如,参见Matt Gemmell's site上的iTableView的源代码,以获得绘制内容的明确示例。
最后,我认为Abizer建议去看看BWToolkit的代码是一个好主意。一开始可能有点压倒性,但如果您能够阅读并理解该代码,那么您可以毫不费力地实现自己的自定义视图和控件。
答案 1 :(得分:3)
看看一些优秀的示例代码:BWToolkit