我有一個UITableView
,它在單元格中顯示大量圖像,我對於滾動性能並不放棄。我的UITableView
就像iphone上的照片應用程序。有誰知道爲什麼iphone foto應用程序快速滾動,就好像它們在屏幕上沒有任何東西。帶有很多圖像的iphone桌面
有沒有人有一些提示/技巧來提高我的性能/滾動速度?
我有一個UITableView
,它在單元格中顯示大量圖像,我對於滾動性能並不放棄。我的UITableView
就像iphone上的照片應用程序。有誰知道爲什麼iphone foto應用程序快速滾動,就好像它們在屏幕上沒有任何東西。帶有很多圖像的iphone桌面
有沒有人有一些提示/技巧來提高我的性能/滾動速度?
你應該precache你的圖像,而不是懶洋洋地做。當你滾動你的桌子時,UITableViewDataSource:cellForRowAtIndexPath:方法被調用,如果你在那裏加載你的圖像,那麼你會看到它請求你的單元格內容作爲你的滾動,在你的應用程序中創建延遲。嘗試將讓你的cellForRowAtIndexPath:是這樣的:
NSDate *date = [NSDate date];
... your cell loading code ...
NSLog(@"Elapsed time to generate cell %.2d", [date timeIntervalSinceNow]);
你會看到你花多長時間讓每個細胞。
爲了解決這個問題,你可以像你需要的那樣複雜 - 如果你有一個很多的圖像,你將不得不變得更加聰明。你可以做分頁加載,在那裏你跟蹤最後一個單元格請求的NSIndexPath,並確定滾動是上升還是下降,並使用+NSImage:imageNamed:立即獲取一些頁面值的圖像(即5個圖像在你當前位置的前方),或者任何適合你的東西(利用人們必須將手指放回桌子底部再次滑動的事實,因此桌面元素的消耗已經暫停 - 您可以使頁面大小足夠大填充滑動)。不過,這可能仍然不是很好,因爲你會立刻受到你所有的影響,而不是每個細胞的負擔。
您可以快速將控制權返回給用戶界面,並允許系統使用NSImage:imageNamed :,使用NSRunLoop:performSelector:target:argument:order:mode:關閉主循環中的預取圖像頁面,它將可用於顯示。
雖然你需要痛苦地意識到內存問題。如果您發現這是一個問題,請使用NSImage:initWithContentsOfFile:,這將在內存不足的情況下清理圖像緩存。根據高速緩存失效算法使用的策略,這些情況可能會在清除高速緩存時導致「口吃」,並且必須重新加載無效的預取。
通過對UITableViewCell進行子類化並直接繪製每個單元格的內容,已經報告了很好的滾動性能結果。有關更多詳細信息和代碼示例的鏈接,請參閱this question的接受答案。
您鏈接到的博客中的討論不適合這個問題 - 它談論的是在iphone中合成性能,並建議您通過實現自己的繪圖代碼來使用完全不透明度來照顧這一點。這個問題可能沒有受到這個問題的困擾。通常情況下,除非你有充足的理由,否則你不應該擴大細胞本身!添加contentView並設置backgroundView以便正確處理表格動畫會更好。 – groundhog 2009-08-08 02:48:35
這裏的問題是內存,你一次加載太多高分辨率的圖片,照片應用程序不使用tableview它使用滾動視圖,它一次只加載最多3張圖片,所以內存是不是一個問題,如果你正在嘗試做類似的照片應用程序使用滾動視圖
我不必使用丹尼爾建議的scrollview?他們有區別嗎? – Ton 2009-08-08 09:53:23
沒有 - 事實上丹尼爾斯的評論有點奇怪,因爲我對照片應用程序的看法是在整個屏幕上加載整個網格,四個寬。這很難 - 但他們正在做的是保留縮略圖並使用它們。如果你快速滑動一下,它仍然不是完全平滑的。表格實際上更容易,因爲它讓你知道何時需要獲得更多圖像。 – groundhog 2009-08-08 14:27:59
謝謝你的解釋! – Ton 2009-08-08 20:46:39