提高CollectionView加载速度

时间:2017-05-31 13:08:15

标签: ios swift uicollectionview

我有一个带有年份概述的日历视图:

I build it to look exactly like the iOS Calendar

为此,我有以下View层次结构:

  • 的ViewController
    • 查看
      • 12个单元格的集合视图(每月一个)
        • Colleciton View包含49个单元格(每天一个+进出日期+星期几)

现在谈到以下代码部分,我在概述中加载了几天的单元格:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CalendarPageYearCollectionCellMonthCell;

    print("cell for item at: \(indexPath.item)");

    cell.layer.shouldRasterize = true;
    cell.layer.rasterizationScale = UIScreen.main.scale;

    cell.label.text = self.days[indexPath.item];

    return cell;
}

此代码部分需要9秒钟。同时UI被冻结。如何显着提高这些单元格的加载和渲染速度,以便加载视图不会超过1秒?

编辑我发现代码的哪一部分耗费了这么长的时间。我以编程方式创建了UICollectionViewCell

import Foundation
import UIKit
import SnapKit

class CalendarPageYearCollectionCellMonthCell : UICollectionViewCell {

    var label: UILabel! = nil;

    override init(frame: CGRect) {
        super.init(frame: frame);

        self.setupView();
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setupView() {
        self.backgroundColor = UIColor.green;

        self.label = UILabel();
        self.label.font = UIFont(name: "HelveticaNeue", size: 12);
        self.label.textColor = PaintBox.colorWithName(VKBColor.black, andAlpha: 1.0);
        self.label.backgroundColor = UIColor.red;
        self.label.textAlignment = .center;
        self.sizeToFit();
        self.label.center = self.center;

        self.addSubview(self.label);
    }
}

因此,当我使用此代码时,Calendar加载速度非常快。但是使用该代码,您将永远不会看到您添加为子视图的标签。所以我需要添加一些约束:

func setupView() {
    self.backgroundColor = UIColor.green;

    self.label = UILabel();
    self.label.font = UIFont(name: "HelveticaNeue", size: 12);
    self.label.textColor = PaintBox.colorWithName(VKBColor.black, andAlpha: 1.0);
    self.label.backgroundColor = UIColor.red;
    self.label.textAlignment = .center;
    self.sizeToFit();
    self.label.center = self.center;

    self.addSubview(self.label);

    self.label.snp.makeConstraints { make in
        make.edges.equalToSuperview();
    }
}

现在加载视图需要很长时间。所以真正的问题似乎是限制。

有没有办法只创建一个单元格,只需设置文本就可以将其复制到所有其他单元格?

1 个答案:

答案 0 :(得分:0)

因此经过大量的研究后,我得出的结论是,在使用故事板和约束时,我无法加快速度。它总是很慢。

所以我试图摆脱所有xib文件,故事板文件和约束。结果令人难以置信。我从加载速度为9秒的视图加载到230毫秒的加载速度。

所以我向所有人推荐:如果你遇到性能问题,就不要使用xib,故事板或约束。只需自己编码所有内容并直接设置所有视图框架。