繁体   English   中英

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

[英]Poor UITableView Scrolling Performance issue iOS 7

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

仪器显示dequeueReusableCellWithIdentifier:forIndexPath:消耗的时间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;
            }

        }

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

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

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

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

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

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

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

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

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

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

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

编辑:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM