2009-04-19 48 views
0

我正在尝试创建一个使用嵌入式NSButtonCell对象的自定义范围栏。但是,当鼠标悬停时,我无法绘制挡板。我可以通过创建跟踪区域并在鼠标进入时将showsBorderOnlyWhileMouseInside设置为NO以及在向外移动时将YES设置为YES来实现它,但这对我来说就像是一种黑客攻击,特别是因为NSButtonCell会自行执行跟踪。在自定义控件中嵌入多个NSButtonCell

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

该技术必须是可能的,因为NSMatrix做到了这一点,但在阅读了每个可用的API和论坛之后,我还没有找到一种方法来启动NSButtonCell的跟踪行为,而不使用其控件的setCell方法。我的前额从桌面上跳动而来 - 血淋淋的 - 帮助将不胜感激。

回答

1

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

0

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

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

另一个说明:您可能想要 - 而不是使用多个buttonCell - 查看在此视图中使用多个按钮来执行此任务。在像NSMatrix这样的现有类之后对自己的类进行建模是令人钦佩的,但是对于复杂的行为,比如你正在寻找的东西,往往更偏离一点。 使用许多视图而不是使用单个视图与一组单元格的概念很昂贵仍然有一些优点,但是如果要走这条路线需要一个hacky实现,那么我会用另一种方式。

+0

谢谢,德克 - 我完全同意。我认为文档对NSCell的赞誉让我对使用按钮感到内疚。我认为我会追赶鼠洞一段时间,但似乎没有一个令人满意的解决方案来实现这一点。 我试过updateTrackingAreaWithFrame:inView:方法,但它没有做到这一点。当Cocoa用NSButton做这件事时看着堆栈显示了一堆私有API传递,所以它看起来不像我们自己想做的那样。 – 2009-04-20 00:55:31

相关问题