我想在我的iOS應用程序中創建一個可縮放的時間線,用於一種待辦事項列表。放大會顯示幾天和幾小時,縮小會觸發摺疊日或縮小到幾個月。將會有一個滾動功能。如何在iOS中創建可縮放的時間軸?
舉個例子,我希望它是這樣工作的:http://almende.github.com/chap-links-library/js/timeline/doc/
什麼樣的基本觀點的將是這一個恰當的起點,牢記應儘可能低所需的內存?一個UITableView,UIScrollView,或其他的工作呢?
我想在我的iOS應用程序中創建一個可縮放的時間線,用於一種待辦事項列表。放大會顯示幾天和幾小時,縮小會觸發摺疊日或縮小到幾個月。將會有一個滾動功能。如何在iOS中創建可縮放的時間軸?
舉個例子,我希望它是這樣工作的:http://almende.github.com/chap-links-library/js/timeline/doc/
什麼樣的基本觀點的將是這一個恰當的起點,牢記應儘可能低所需的內存?一個UITableView,UIScrollView,或其他的工作呢?
UITableView
絕對不適合。 UIScrollView
可能會更好,但它不適合動態或非常長的內容。
我相信easist的方法就是自己做所有事情 - 通過的子類drawRect
實現它。當然,您應該使用UIPanRecognizer
,方法與UIScrollView
使用它相同。
感謝的人我用這種方法取得良好進展 – 2013-03-08 14:42:51
我只想指出,一個UIScrollView是超過適合非常長的內容 - 如果你平鋪和回收單元格,就像UITableView和UICollectionView一樣。這意味着任何你看不到的東西都會被移除並回收。對UIView進行子類化並重寫'drawRect'既不容易也不重要,特別是如果你期望與元素交互或者動畫運動。 – Luke 2013-03-08 17:14:58
@Luke你對'UIScrollView'的建議基本上和你使用drawRect所做的一樣。相信我,動畫並沒有什麼困難,因爲scrollview所做的一切都是基於來自泛識別器的數據改變水平和垂直偏移量。重寫'drawRect'並不複雜,用'UIScrollView'重複使用視圖並不複雜。而且,它更符合記憶。我剛完成自己的可滾動組件,並且交互或動畫沒有問題。 – Sulthan 2013-03-08 17:25:42
UICollectionView
/UITableView
將不起作用,因爲單元格幾乎總是相同的寬度/高度。最重要的是,細胞總是在每個細胞之間具有相同的間距。因此,它能夠輕鬆計算出索引範圍,並根據索引查詢其需要的單元。
另一方面,時間軸視圖與這些控件有很大不同。單元格之間的間距不同,單元格有時會彼此重疊。如果你有一個按位置排序的數據源,那麼控件仍然會猜測從哪裏開始尋找範圍。因此,找到正確的索引範圍將會更加昂貴 - 您只需找到合適的算法以在較短的時間內確定這一點。
您將不得不通過繼承UIScrollView
來構建自己的控件。你根本不應該混淆drawRect
。一個重要的概念,UITableView
和UICollectionView
使用,是dequeue'ing細胞。蘋果公司的PhotoScroller的iOS 5版本通過分頁演示了這個概念(iOS 6版本用UIPageViewController
代替了自定義分頁)。您必須登錄download the old documentation才能獲取舊的示例代碼。
我目前正在構建一個時間軸視圖,我將在某些時候開放源代碼。它有點基於UITableView
,可以在水平或垂直方向工作。它像UITableView
一樣出列細胞。我並不關注標籤或縮放,而是關注單元之間間距不一致的概念。爲了給你一個良好的開端,這裏有我的數據源方法,我對解決:
- (NSInteger)numberOfCellsInTimelineView:(TimelineView *)timelineView;
- (CGRect)timelineView:(TimelineView *)timelineView cellFrameForIndex:(NSInteger)index;
- (TimelineViewCell *)timelineView:(TimelineView *)timelineView cellForIndex:(NSInteger)index;
這些電話中的兩個相同的東西UITableView
了,但它有一個名爲cellFrameForIndex
新的呼叫。這次調用的重要意義在於TimelineView可以猜出一個索引並查找單元格的框架,並查看它適合可見邊界的位置。如果它猜測可見邊界內的單元格,它可以簡單地向前和向後迭代,直到找到邊緣。
目前我正在使用的算法需要round(count * (CGRectGetMidX(timelineView.bounds)/timelineView.contentSize.width))
(水平方向)。基本上這是做了UIScrollView的可見邊界的中點,並獲得已滾動的百分比。然後它乘以單元的數量。這工作相當好。當以隨機間隔測試一個具有100,000條記錄的隨機數據集時,cellFrameForIndex
的範圍爲8到150.我可以用這個來拉52-60 FPS。我仍在努力,並試圖找到一種更好/更快的方式來確定指數範圍。我試圖將它保持在可見細胞數+10(最大)迭代次數。
如果您有時間等待,我會更新我的答案,以便在完成後包含指向我的GitHub項目的鏈接。這可能是幾天,一週。我可以添加縮放。但是你必須將它分叉並添加標籤和其他你想要的東西。
編輯:
這裏是我的Github上的項目:https://github.com/lukescott/TimelineView
這個問題可能需要一些編輯,但我的理解是,這是一個有效的問題。 – Luke 2013-03-06 00:42:36
你有沒有考慮過Core繪圖? https://code.google.com/p/core-plot/ – 2013-03-11 23:53:47
PM我,如果你仍然在尋找 – Chris 2015-05-31 02:49:33