2014-04-01 34 views
4

我有一個UITableView包含超過20行,每個UITableViewCell包含一個UITextView,我可以設置不同的UIFont,對齊方式和顏色。當我向下或向上滾動時,滾動期間會出現波動或滯後,當我刪除字體和文本顏色並對齊時,一切都變得完美。蘋果是否改變了在iOS 7中重繪文本的方式?這在以前的iOS版本中沒有發生。可憐的UITableView滾動性能問題iOS 7

儀器顯示,時間dequeueReusableCellWithIdentifier:forIndexPath:消耗

- 更新添加代碼

if (unit.fontName != nil) { 
      textView.font = [UIFont fontWithName:unit.fontName size:unit.fontSize.floatValue]; 
     } 
     if (unit.fontColor) { 
      textView.textColor=[self convertString:unit.fontColor]; 
     } 
     else { 
      textView.textColor=[UIColor colorWithRed:0 green:0 blue:0 alpha:1]; 
     } 
     if ([unit.fontSize floatValue] !=0) { 
      textView.font = [UIFont fontWithName:textView.font.fontName size:[unit.fontSize floatValue]]; 
     } 
     if (unit.textAlignment) { 

      switch ([summaryUnit.textAlignment intValue]) { 
       case 0: 
        textView.textAlignment = NSTextAlignmentLeft; 
        break; 

       case 1: 
        textView.textAlignment = NSTextAlignmentCenter; 
        break; 

       case 2: 
        textView.textAlignment = NSTextAlignmentRight; 
        break; 

       default: 
        break; 
      } 

     } 
+0

顯示您的代碼。你有沒有設置配置,或者每個單元格都不一樣? – Wain

+0

你有你的tableView自定義的UITableViewCell類嗎? –

+0

@RajSubbiah是的我有一個自定義單元格 –

回答

15

有很多事情要在一個UITableView的幕後,可能不會使它顯而易見的,爲什麼它看起來沒有反應。

作爲一個例子,你不應該在tableView:heightForRowAtIndexPath:中做很多工作,因爲UITableView需要詢問數據集中每一行的高度,而不管它們是否在屏幕上顯示。它這樣做是爲了確定內容大小。

它可能根本不是您的數據或您的單元格導致問題。具有大量子視圖的複雜單元格可能會在合成器中渲染緩慢。特別是如果你有像透明度的東西。

因此,每當我實現UITableView時,我總是會爲自己放下四條基本規則。

1)總是知道你重新加載數據時需要告訴表視圖。不要在數據源或委託方法中做很多東西。在UITableView需要它時準備好。

2)不要在滾動週期內破壞並創建視圖。由此,你不應該創建新的UIView(或其他) - 作爲你的prepareForReuse方法的例子。只需重置現有視圖和控件的內容,然後在UITableView要求時重新配置它們。

3)在單元中不要有複雜的視圖層次結構。特別是需要渲染的透明度和超出範圍的內容對於合成器以足夠快的速度進行渲染可能非常麻煩。

4)請勿在tableView:cellForRowAtIndexPath:中配置您的單元格。只需出隊並返回所需的單元格。總是在tableView:willDisplayCell:forRowAtIndexPath:委託方法中配置和設置單元格。

這就是說,有一些技巧可以幫助你。正如我上面提到的,不要在單元格的prepareForReuse方法中創建和銷燬視圖或控件。根本不要做重量級的工作。只需重置您的觀點並繼續。 這可能聽起來像你正在做的,因爲它是導致你的麻煩的dequeueReusableCellWithIdentifier:forIndexPath:

最後如果是因爲合成的(儀器會顯示一些石英相關的方法工作),你可以用你的電池的的CALayer的shouldRasterizerasterizationScale成功。這有時可以加速渲染細胞的可觀性。

讓我知道這些東西是否有意義,是否可以解決您的問題。

編輯:

PS。是。 Apple確實改變了iOS 7中的文本渲染。但是,爲什麼你使用UITextView?!?我不太瞭解它,但我知道它比UITextField或UILabel重得多。也許你可以考慮使用這些。 UITextView通常用於編輯類似文檔的東西(如Notes應用程序)。 我真的認爲這可能是導致你的煩惱的原因。

+0

我正在使用UITextViews,因爲我們需要編輯這個文本,我將用UILabel替換它,並將tableView:cellForRowAtIndexPath中的代碼替換爲tableView:willDisplayCell:forRowAtIndexPath:然後檢查結果 –

+0

你不能只用UITextField嗎?這就是我在需要單元格中的文本編輯功能時使用的。除非你需要多線路功能。 – Trenskow

+0

是的,我們需要多行功能 –