2009-08-29 28 views
87

我有一個可以在每個單元格中加載相當大的圖像的uitableview,並且單元格高度根據圖像的大小而變化。滾動性能不錯,但有時可能會變幹。改善iPhone UITableView滾動性能的技巧?

我發現這些技巧我在FieryRobot博客上發現:

glassy-scrolling-with-uitableview

more-glassy-scrolling-with-uitableview

有誰有改進的UITableView滾動性能的任何提示?

+0

如果你需要緩存細胞高度(這可能是昂貴的計算,也經常使用),我舉了一個例子。只有在適用於您的應用程序時纔可以使用它。 http://stackoverflow.com/questions/1371223/how-do-i-cache-something-for-a-tableview/10992748#10992748 –

回答

151
  1. 緩存行的高度(表視圖可以請求這經常)
  2. 創建表中使用的圖像最近最少使用的緩存(和你的時候失效的所有非活動條目收到內存警告)
  3. 畫出一切UITableViewCelldrawRect:如果可能的話,不惜一切代價避免子視圖(或者,如果你需要的標準的輔助功能,內容畫面的drawRect:
  4. 讓你UITableViewCell的層不透明(SA我去的內容視圖,如果你有一個)
  5. 所推薦UITableView例子/文檔
  6. 避免漸變/複雜的圖形效果未預焙成UIImage小號
+4

此外,下載的圖像應該縮小到imageView的大小,然後再顯示在單元上! –

+3

我想補充一點,這是我過去幾年的經驗 - 透明細胞可能永遠不會造成滾動性能不佳。我們有一個非常複雜的單元格(20 +子視圖)的應用程序,它顯示背景都是透明的。通過適當的優化,即使在3GS上,透明度也沒有什麼不同。事實上,減緩最多東西的東西是在有足夠的單元格從桌面視圖中出列之前的筆尖加載。如果使用子視圖,只要確保有高效的層次結構,並且不需要使用drawRect。 – Accatyyc

+0

@Accatyyc,似乎我有同樣的問題。當沒有足夠的信元出隊時,有3-4個信元出隊,然後滾動平穩。有什麼方法可以預先加載單元格,以便在滾動時有單元出隊和不加載NIB文件? – Tiois

40
  1. 如果你繼承 UITableViewCell,不要使用筆尖, 它寫在代碼代替。它比加載Nib文件快得多,比 快。
  2. 如果您使用的圖像,確保 你緩存他們,所以你不 必須從文件加載超過 每進行一次(如果你有 記憶 - 你會驚奇地發現 太多的空間圖像佔用)。
  3. 儘可能多地使元素不透明,如 。同樣,不要嘗試並使用具有透明度的圖像 。
+0

兩票否決票? Ooookay ... –

+3

別擔心......那是巨魔。很好的回答! – Steav

+0

感謝您的圖像緩存提示 – pepsi

33
使用reusableCellIdentifier功能

Tweetie背後的開發人員已經撰寫了大量關於此的文章,並且有一些代碼演示了該應用的完成方式。基本上,他/她提倡爲每個表格單元格定製一個視圖,並手動繪製它(而不是使用Interface Builder進行子視圖以及其他選項)。

fast-scrolling-in-tweetie-with-uitableview

而且,蘋果已經更新了的TableView自己的示例代碼在其TableViewSuite教程(也許在應對呢?)

TableViewSuite

+1

這是一個很棒的解決方案。我只是好奇如何將一個UIButton添加到cellView?它是否在drawRect方法中繪製? –

+1

@beno,你的鏈接看起來破碎(第一個)有什麼機會把我們的手放在原始文章上? – apouche

+2

原文可以在這裏閱讀:http://web.archive.org/web/20100922230053/http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/ – jverdi

1

#1的性能殺手的UITableView滾動繪圖任何單元格視圖圖層上的陰影,所以如果滾動性能很重要,那麼除非基本上不會減慢主線程,否則不要執行陰影。

認爲這是必須說的,因爲沒有一個被接受的答案提到了陰影和圖層。 :+)

+3

如果問題是陰影添加這兩行代碼和所有作品完美 self.layer.shouldRasterize = YES; self.layer.rasterizationScale = UIScreen.mainScreen.scale; –

0

滾動性能的任何問題都可以使用其他答案中已經描述的技術來解決。然而,很多時候性能低迷是由於內在錯誤或重複造成的。

UITableView重複使用單元以及每個單元可能需要自己的圖像這一事實一起使得解決方案有點複雜。從它如何解決通用的方式,我在這裏總結一些應該注意的事情:

  1. 將數據加載到數據源 - 從REST /數據庫。這一步應該在後臺完成,最終使用dispatch_async和GCD隊列。
  2. 創建並啓動相關的數據模型對象,並把他們的陣列
  3. [tableView reloaddata]
  4. 裏面cellForRowAtIndexPath內,包括代碼,將設置從數組的正確的數據模型對象數據(文本)。
  5. 現在圖像也可能以URL的形式存在,所以這一步可能會有些古怪,因爲表視圖完成了單元重用。事實的核心是使用異步隊列再次從設備緩存/ URL加載圖像,然後將其設置爲更正cell.image(無論您的單元圖像屬性如何)。

爲避免出現問題,請參閱本教程中關於lazy loading of images內部表格視圖。