2008-12-22 68 views
7

我試圖繪製無限大的水平圖形,並且屏幕高度相同。我已經添加了一個UIScrollView,以及一個UIView的子類,它實現了-drawRect:方法。在模擬器中,一切正常,但在設備上,似乎無法在達到一定大小後繪製圖形。如何在UIScrollView中滾動無限大小的UIView

我已經緩存了幾乎所有我可以使用的,基本上只調用-drawRect:部分中的CGContextAddLineToPoint。我只畫出了屏幕上可見的內容。我有一個委託給UIScrollView,它監聽-scrollViewDidScroll:,然後告訴圖形重繪自己([graphView setNeedsDisplay])。

我發現了一種方法,它告訴我重寫+layerClass方法並返回[CATiledLayer class]。這確實允許圖形在設備上實際繪製,但功能非常差。實際繪製的速度非常慢,並且發生淡化效果不理想。

有什麼建議嗎?

回答

3

嗯,這裏是我的答案:我基本上做了類似於UITableView如何處理單元格的東西:我有一個存儲未使用圖的GraphView對象的NSMutableSet。當滾動視圖的一部分變得可見時,我從該組中獲取一個圖形視圖(或者如果該組爲空,則創建一個新視圖)。它已經有了一個scrollX屬性來確定它應該繪製哪部分。我將scrollX屬性設置爲正確的值,而不是使用屏幕寬度,我給它繪製了任意寬度。當它離開滾動視圖時,它將從UIScrollView中移除並添加到該集合中。

我想知道,如果我真的甚至需要刪除他們,當他們走出視圖?只有當我得到低內存警告時,嘗試將它們放入並移除不在屏幕上的可能是謹慎的做法。這可能會擺脫暫停,無論何時需要重繪一段未改變的圖形。

我在這裏的保存優雅是我的GraphView已經被設置爲只繪製一部分圖。我所需要做的只是做出不止一個。

2

我認爲這是iPhone圖形硬件的限制。通過實驗,我看到iPhone會拒絕繪製高度或寬度大於2000像素的幀。這可能與硬件中幀緩衝區的大小有關。

+0

我認爲這不是一個非常有用的答案。顯然有一種方法可以做到這一點,因爲像Google Maps之類的東西似乎可以正常工作。根本不會波濤洶涌,並且在繪製速度方面似乎相當不錯,即使它必須首先下載數據。 – 2008-12-22 20:22:08

+0

我只是說,你不能在一個UI控件內完成它,因爲它的框架太大了。可能有一種方法可以將多個視圖水平放置在一起,但您可能必須自己管理它們(摧毀/創建)。 – 2008-12-22 20:59:46

0

謝謝,這很有幫助。一個問題 - 你用什麼做了UIScrollView的contentSize?只要您不創建緩衝區來填充內容視圖中的整個空間,UIScrollView是否可以容忍大內容大小(超過2000像素)?或者你是否保持UIScrollView的大小不變(例如2個屏幕寬度),並在每次繪製時使用UIScrollView contentOffset屬性(使用scrollX而不是contentOffset來存儲位置)?

我想我回答了我自己的問題(後者似乎是一個更好的選擇),但是,如果其他人需要澄清,我會繼續併發布此信息。

1

觀看名爲「Session 104 - 高級滾動視圖技術」的2011年WWDC會議視頻。