2008-12-19 45 views
13

這些日子似乎越來越多的OS X應用程序正在爲自定義控件做各種各樣的花哨的繪圖東西。像Twitterific應用,物聯網,事件盒,版本只是僅舉幾例....尋找界面組件(可可)的自定義繪圖信息

所以基本上我正在尋找關於如何開始做這種事情的任何信息。不確定是否僅僅通過繼承控件和使用自定義繪圖來完成,還是完全不同。

任何幫助,非常感謝。謝謝!

回答

25

這完全取決於你想要做什麼。

的版本,例如「顯示原始屬性」按鈕是NSButton子類,因爲基本上我們需要的是我們自己的外觀標準按鈕行爲。子類按鈕的一種方法是簡單地在NSButton子類中實現自己的-drawRect:(NSRect)rect方法,但我們決定堅持NSButton在Cocoa中實現的方式,這意味着大多數繪圖都是由按鈕的單元格完成的,所以實施看起來是這樣的:

在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 
} 

在版本的時間線視圖實際上是一個web視圖,該頁面你看到它使用JavaScript t o點擊摺疊標題。

拇指我用在何處使用自定義控制開始時的規則是:

  • 要自定義一個標準的可可控件的外觀:
    • 子類中的適當的控制(例如像NSButton和NSButtonCell)
    • 棒儘可能接近有意義的默認控件實現(在扣式例如方式,從現有attributedTitle實例方法開始繪製按鈕的標題,除非你總是希望用相同的屬性來繪製不管什麼是成立於IB或者如果你需要基於狀態不同的屬性,如在版本主窗口中的試用到期按鈕)
  • 創建一個全新的UI元素繪製:
    • 子類的NSView並且實現幾乎所有的鼠標和關鍵事件處理(在視圖中,不需要重做「hitTest:」)並自己繪製代碼。
  • 要呈現的東西很複雜,任意高度的,但不是表:
    • 看看你是否可以在HTML,CSS和JS做到這一點,並在WebView中出示。網頁在佈置文本方面非常出色,所以如果你可以將這個職責卸載到你的WebView上,這可以大大節省脖子上的痛苦。

推薦閱讀學習如何在自己的自定義視圖的畫法畫的東西:Cocoa Drawing Guide

定製的,例如一個NSTableView是茶的完全其它杯子的外觀,由於複雜性的桌面視圖,這可以發生在整個地方。您將爲您想要在表中執行的某些操作實現自定義單元格,但必須更改行在實際NSTableView對象本身的子類中突出顯示的方式。例如,請參閱Matt Gemmell's site上的iTableView的源代碼,以獲取繪製內容的清晰示例。

最後,我認爲Abizer的建議去檢查BWToolkit的代碼是一個好主意。起初它可能有些壓倒性的,但如果你能夠閱讀並理解這些代碼,你就不會遇到實現你自己的自定義視圖和控件的麻煩。

+0

良好的寫作德克。讓我覺得我一直很懶惰;-) – Abizern 2008-12-19 16:04:32