自定义控件中的多个凹陷NSButtonCell

时间:2009-04-19 21:17:40

标签: objective-c cocoa

我正在尝试创建一个使用嵌入式NSButtonCell对象的自定义范围栏。但是,当鼠标悬停时,我在绘制挡板时遇到问题。我可以通过创建跟踪区域并将鼠标在内部时将showsBorderOnlyWhileMouseInside设置为NO,并在外部移动时将其设置为YES,但这对我来说感觉就像是黑客,特别是因为NSButtonCell会自行进行跟踪。

如果我使用控件的setCell方法,按钮单元格将调用控件的addTrackingRect:owner:userData:assumeInside:并设置自己的跟踪以在鼠标悬停时绘制边框。但是,如果我想在同一个控件中使用多个按钮单元格,我尝试使用按钮单元格的setControlView方法将每个单元格的controlView设置为自定义控件,但它不会提示单元格设置像setCell那样的跟踪区域。

这项技术必须是可行的,因为NSMatrix会这样做,但在阅读了所有可用的API和论坛之后,我还没有找到一种方法来启动NSButtonCell的跟踪行为而不使用其控件的setCell方法。我的额头因在桌子上跳动而血腥 - 请帮助。

2 个答案:

答案 0 :(得分:1)

我后来回到这一点,发现如果将自定义子类更改为NSControl而不是NSView,则单元格会自动处理addTrackingRect方法。只需调用单元格的mouseEntered / mouseExited方法,即可实现单元格的悬停模式。希望这有助于某人。

答案 1 :(得分:0)

首先,创可贴可能是第一件可以提供帮助的东西。 ;)

您是否尝试过使用NSButtonCell的-updateTrackingAreaWithFrame:inView:方法?它没有记录,但显示在类的转储在Leopard上生成的NSButtonCell标头中。我不确定关于使用不以下划线开头的非记录方法的官方用语或一般共识是什么,所以请注意这一点。

另一个注意事项:您可能希望 - 而不是使用多个buttonCells - 在视图中使用多个按钮来执行此任务。在像NSMatrix这样的现有类之后对自己的类进行建模是令人钦佩的,但对于像您正在寻找的复杂行为,偏离一点往往更有成效。 使用许多视图而不是使用带有一堆单元格的单个视图的概念是昂贵的仍然有一些优点,但如果走这条路线需要一个hacky实现,我会走另一条路。 / p>