2011-10-31 75 views
2

My Cocoa應用程序收集需要在時間軸中顯示的事件(NSManagedObject的實例)。我最初的方法是使用現有的基於Javascript的小部件(我嘗試使用Simile Timeline和Timeglider)並使用WebView控件顯示時間線。這原則上是有效的,但不幸的是,這些小部件不能很好地處理BC日期,這是我的應用程序的一個重要要求。如何使用可可實現時間線自定義控件?

在我的應用程序事件具有日期範圍從500.000BC高達近日期。活動日期僅用一年表示。他們的日,月和時間屬性是無關緊要的。

丟棄javascript的方法後,我留在顯示使用自定義可可控制時間軸的選項。由於我找不到合適的人,我必須自己開發。

這將是我的第一個自定義可可控制和思考這一段時間,我想出了以下設計粗糙後:

  • 我需要一個自定義控件呈現的實際時間一致。此控件可能基於NSView。該控件應根據時間線上的刻度線數量乘以每個標記之間的寬度(像素)計算其大小。例如,時間線由幾百年組成,每個世紀100個像素寬。在10.000BC和5.000BC之間的事件時間線則是5000個像素寬(10000 - 5000 = 5000年,等於50個世紀)。

  • 我需要一個滾動型包裝的時間表,以允許它支持滾動行爲。只需要水平滾動。

  • 我需要一些東西來表示一個實際事件。我正在考慮爲此使用現有的控件,可能是標準的圓形按鈕和標籤一起作爲單個控件。

  • 我需要一個自定義控件呈現在時間線上的刻度。

把這作爲我在Cocoa的時間線組件的基本設計,這樣做還是我完全忽略了這一點?

+0

羅傑,你有過這樣的事嗎?我遵循類似的時間表(只是爲了覆蓋24小時)。 – Darren

+0

@達倫是的,我做到了。工作很好。我剛剛完成了最初設計的重大重構。 – Roger

+0

@Roger你有沒有iPhone的示例代碼。我有類似的需求? – arshad

回答

1

基本的方法聽起來很好。

蘋果有一個很好的例子,可以創建一個名爲「TreeView」的自定義NSView。這是一個很好的理解樣本。

https://developer.apple.com/library/mac/#samplecode/TreeView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010131

「樹視圖」呈現從頭開始創建一個完全新的自定義 視圖(通過直接子類的NSView)的一個例子。它的實施 說明了許多參與創建自定義視圖 ,包括內容佈局的問題,繪圖,處理用戶 互動,並提供輔助支持的考慮。

你可能要考慮的另一件事是放大和縮小。如果你有很長的時間表,我想你可能想縮小,然後放大一組活動。如果您在公元前10k有一個事件,然後很久以後發生一連串事件,用戶可以滾動瀏覽大量空白空間來查找事件。另一種方法是在上面有一個適合於/靜態大小的小型時間軸,這有點像索引,其中線條顯示活動點 - 然後點擊它將自動滾動到該點。這可能是一個很好的取決於你的數據。

的幾點思考:

對於一些這種風俗畫,你要重寫的drawRect繪製您的線條和佈局的子控件。

如果您繪製背景或意見的任何部分,確保啓用層支持的觀點:

[self setWantsLayer:YES]; 

如果可以的話,正如你指出,嘗試添加和佈局充分利用現有的控制。在我的自定義控件中,我維護獨立於代表所有對象狀態的視圖/控件的數據結構。在drawRect中,我檢測到視圖正在改變,我調用了我的layoutSubviews函數。我的layoutSubViews函數將從我的數據結構中進行數學運算,並創建或移動現有控件的框架。這適用於調整大小和縮放。如果放大,你的標籤廣告標記將需要很好地反應被縮小非常小的 - 也許文字滴出在某個時刻等..

if ([self dataSource] && 
    !NSEqualRects(_prevRect, [self bounds])) 
{ 
    // layoutViews is my custom function that worked over the data structures 
    // and moved the frame 
    [self layoutViews]; 
} 

_prevRect = [self bounds]; 

希望有所幫助。

+0

謝謝。關於縮放的好點。我嘗試過的一個Javascript小部件具有迷你時間軸功能。暫時我會把它放在一邊,以增加#2 :-) – Roger

相關問題