糟糕的UITableView滚动性能问题iOS 7

时间:2014-04-01 11:16:26

标签: ios objective-c uitableview

我有一个包含超过20行的UITableView,每个UITableViewCell包含一个UITextView,我可以设置不同的UIFont,对齐和颜色。当我向下或向上滚动时,滚动过程中会出现波动或滞后,当我删除字体和文本颜色并对齐时,一切都变得完美。 Apple是否改变了在iOS 7中重绘文本的方式?以前的iOS版本没有发生这种情况。

仪器显示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;
            }

        }

1 个答案:

答案 0 :(得分:15)

在UITableView中幕后发生了很多事情,这可能并不能说明为何它看起来没有反应。

例如,您不应该在tableView:heightForRowAtIndexPath:中完成大量工作,因为UITableView需要询问数据集中每一行的高度,无论它们是否在屏幕上显而易见。这样做是为了确定内容大小。

可能根本不是您的数据或您的单元格导致问题。具有大量子视图的复杂单元格可能会在合成器中变慢。特别是如果你有像透明度这样的东西。

因此,每当我实现UITableView时,我总是为自己制定四个基本规则。

1)重新加载数据时,始终知道需要告诉表视图。不要在数据源或委托方法中做很多事情。在UITableView需要它时做好准备。

2)不要在滚动循环中销毁和创建视图。这样,您不应该创建新的UIView(或其他) - 作为prepareForReuse方法中的示例。只需重置现有视图和控件的内容,然后在UITableView要求时重新配置它们。

3)您的单元格中没有复杂的视图层次结构。尤其是需要渲染的透明度和越界内容,对于合成器以足够快的速度渲染来说可能很麻烦。

4)请勿在{{1​​}}中配置您的单元格。只需出列并返回所需的单元格。始终使用tableView:cellForRowAtIndexPath:委托方法配置和设置单元格。

话虽如此,有一些技巧可以帮助你。如上所述,请勿在单元格的tableView:willDisplayCell:forRowAtIndexPath:方法中创建和销毁视图或控件。根本不做重量级的工作。只需重置您的观点并继续。 这可能听起来像你正在做的,因为prepareForReuse导致你的麻烦。

最后,如果是因为合成(Instruments会在某些与Quartz相关的方法中显示),您可以使用单元格CALayer的dequeueReusableCellWithIdentifier:forIndexPath:shouldRasterize成功。这有时会加速细胞的渲染速度。

让我知道这些东西是否有意义,如果它可能解决了你的问题。

编辑:

PS。是。 Apple确实改变了iOS 7中的文本呈现。但是你为什么要使用UITextView?!?我不太了解它,但我知道它比UITextField或UILabel更重要。也许你可以考虑使用它们。 UITextView通常用于编辑类似文档的内容(如Notes应用程序)。 我真的认为这可能是造成麻烦的原因。