2011-05-09 34 views
0

我有一個甘特圖,我想在iphone上可見。如何平滑滾動瀏覽大型uiscrollview上的600ishuilabels(iphone)

它是7200 x 1800px大,由〜600條,其中每個是一個UILabel。

這是這個樣子:

Gannt

現在我已經得到了它的工作。在〜100條,我可以通過簡單地將它們全部添加到滾動視圖來使它運行得非常順利。然而,當完整的600(或更多)最終崩潰時,我實例化所有這些uilabels並將它們全部添加到子視圖的滾動視圖中。

所以我所做的是讓它只爲當前可見的行創建uilabels,並且隨着用戶向上和向下滾動,它將刪除不可見的uilabels並添加新可見的行。

但是,當您垂直滾動,因爲它橫跨每個行邊界,並且必須渲染另一行並刪除舊行時,這種抽動非常明顯。

有沒有人有任何建議來解決這個問題?任何想法什麼是緩慢的部分?實例化uilabels,或將它們添加爲子視圖或其他任何東西?

所有幫助將不勝感激。

+0

我已經嘗試將隱藏的標籤合併爲滾動,並重新使用它們以節省分配新顯示的內容,但它不會加快速度。 – Chris 2011-05-09 06:42:28

+0

這可能是內存問題,您的手機是否自動釋放? – Jhaliya 2011-05-09 06:49:22

+0

您是否嘗試過移動標籤而不是隱藏它們? – 2011-05-09 07:00:18

回答

3

蘋果有一些非常好的演示代碼,說明如何做到這一點。檢查出TiledScrollView.m特別是layoutSubviews方法。

其他的事情你可能會考慮:

  • 如果標籤相當長的水平,可能需要將它們分解成更小的塊。在這種情況下,相當長的時間比屏幕更寬。

  • 確保您的UILabels不透明。滾動需要合成的東西會增加額外的開銷,這可能會解決您的一些問題。

  • 看着你的屏幕截圖,行和列標題不是不透明的,而是使用了alpha。鑑於這是一個很好的效果,它可能暫時讓它們變得不透明,只是爲了看看這是否會對你的問題造成影響。我認爲這不會對您的問題做出太多貢獻。正在合成的區域非常小。

+0

這個想法是從滾動視圖中構建一種表視圖,它現在可以回收圖像塊(或標籤,而不是您的情況)的細胞。滾動視圖是子類,一組可重用的圖塊保留爲其實例變量之一。正如@idz指出的那樣,實現的關鍵是在'layoutSubviews'中從超級視圖中移除已移出可見區域的圖塊,然後爲新顯示的內容回收圖塊並將其添加爲子視圖。通過這種方式,只有可見的圖塊被加載到內存中......你應該看看這個演示; Apple爲您提供了完整的代碼,使其更快更流暢。 – 2011-05-09 08:39:41

+0

非常感謝您指出該演示,我會看到我可以從中收集... – Chris 2011-05-09 23:24:46

+0

@Chris,不客氣!我用它來做和你所做的很相似的事情。就我而言,它必須在iPad(以及iPhone)上工作,因此一次可以看到更多的標籤。它確實很好地工作。 – idz 2011-05-09 23:43:42

1

只是一個想法,但問題可能在於,即使您正在緩存並重新使用標籤,滾動視圖仍會保留它們,因此即使您只有少數標籤,每個標籤仍會保留數百次。如果是這樣,那麼我會認爲滾動視圖仍然有效地試圖管理這幾百行。

所以@Nathon S問 - 你移動它們嗎?即構建一組有限的標籤並在滾動視圖上移動它們以匹配觀看區域。如果你隱藏並重新添加到滾動視圖,那麼我會懷疑一大組留存減速。我認爲,通過移動標籤設計,您不需要在初始顯示之後進行任何隱藏並添加。這應該使它非常快速和輕量級。

+0

我試過兩種方法 - 在滾動條中添加和刪除它們(在刪除之前將它們存儲在「池」數組中),以及嘗試簡單地移動它們。兩者都很慢。 – Chris 2011-05-09 08:11:41

+0

好吧,我沒有這方面的經驗知道,所以這可能是完全錯誤的:-)但你有沒有檢查過所有的「動作」是在同一個動畫塊中完成的?我記得閱讀關於它的一些與圖形性能有關的東西。 – drekka 2011-05-09 08:14:35

+0

嗨德里克,沒有動畫塊,我只是讓uiscrollview進行正常的滾動 – Chris 2011-05-09 23:25:13