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

Mus*_*him 5 objective-c uitableview ios

我有一个包含超过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;
            }

        }
Run Code Online (Sandbox Code Playgroud)

Tre*_*kow 15

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

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

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

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

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

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

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

4)不要配置您的单元格tableView:cellForRowAtIndexPath:.只需出列并返回所需的单元格.始终在tableView:willDisplayCell:forRowAtIndexPath:委托方法中配置和设置单元格.

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

最后,如果是因为合成(仪器将在一些与Quartz相关的方法中显示工作),您可以通过使用shouldRasterizerasterizationScale您的单元格的CALayer成功.这有时可以加快细胞的渲染速度.

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

编辑:

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