我有一个带有年份概述的日历视图:
为此,我有以下View层次结构:
现在谈到以下代码部分,我在概述中加载了几天的单元格:
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();
}
}
现在加载视图需要很长时间。所以真正的问题似乎是限制。
有没有办法只创建一个单元格,只需设置文本就可以将其复制到所有其他单元格?
答案 0 :(得分:0)
因此经过大量的研究后,我得出的结论是,在使用故事板和约束时,我无法加快速度。它总是很慢。
所以我试图摆脱所有xib文件,故事板文件和约束。结果令人难以置信。我从加载速度为9秒的视图加载到230毫秒的加载速度。
所以我向所有人推荐:如果你遇到性能问题,就不要使用xib,故事板或约束。只需自己编码所有内容并直接设置所有视图框架。