2009-04-19 18 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

相關問題