gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:20:00 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

例如,Versions 中的“Show Raw Properties”按钮是一个 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
}

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

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

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

关于学习如何在您自己的自定义 View 的绘制方法中绘制东西的推荐阅读:Cocoa Drawing Guide

自定义 NSTableView 的外观完全是另外一回事,这要归功于 tableview 的复杂性,它可以在任何地方发生。您将为您想要在表中执行的某些操作实现您自己的自定义单元格,但必须更改在实际 NSTableView 对象本身的子类中突出显示行的方式。例如,在 Matt Gemmell's site 上查看 iTableView 的源代码一个清楚的例子,说明在哪里画什么。

最后,我认为Abizer建议去检查BWToolkit的代码是个好主意。一开始可能有点不知所措,但如果您能阅读并理解该代码,您将可以毫不费力地实现自己的自定义 View 和控件。

关于objective-c - 寻找有关界面组件自定义绘图的信息(Cocoa),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/380875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com