2014-04-01 36 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

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