UICollectionViewCell中的UICollectionView缓慢/滞后滚动

时间:2016-08-08 16:01:45

标签: ios uicollectionview lazy-loading uicollectionviewcell uicollectionreusableview

我正在尝试创建一个与iOS相同但只有四年的日历视图。

The hierarchy is like: UICollectionView: One Section for each year UICollectionViewCell: 12 cells/items for 12 months in an year UICollectionView: UICollectionViewCell: Upto 31 cells for month day string, which have UILabel as their content.

附带截图。

enter image description here

为了克服延迟滚动,我删除了Month单元格的数据源。容器视图控制器本身就是两个集合视图的数据源。

12个月的集合视图已被子类化以存储年份值的索引路径。从本教程中获得了这个技巧:https://ashfurrow.com/blog/putting-a-uicollectionview-in-a-uitableviewcell/

但问题仍然存在,因为我在显示它之前在月份单元格上调用reloadData。

为了解决这个问题,我确实覆盖了UICollectionViewCell的prepareForReuse()方法,并在monthCollectionViewCell中将indexPath,delegate和datasource属性设置为nil。另外,删除了reloadData调用。但滚动仍然是滞后的。

教程链接与我的工作流程非常相似。

以下是我的代码的链接:https://github.com/nipun0505/TestCalendarView

1 个答案:

答案 0 :(得分:2)

您可以通过以下方式减少延迟:

1)缓存你的颜色。

尝试评论这行代码,看看滞后有多好:

//        if ([[_dateCompareFormatter stringFromDate:date] isEqualToString:[_dateCompareFormatter stringFromDate:[NSDate date]]])
//        {
//            dayCell.dayLabel.backgroundColor = [UIColor cyanColor];
//        }

//        else
//        {
//            dayCell.dayLabel.backgroundColor = [UIColor clearColor];
//        }

在缓存颜色后,请记住,清晰的颜色会比不透明的颜色更多。

2)为什么要在这个函数中一遍又一遍地创建日期格式化程序?

(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
NSDateFormatter *df = [[NSDateFormatter alloc] init];

请缓存这样的内容。缓存是你的朋友。

3)其他领域的表现也可以提高。你的日历加载时间很糟糕:s。

如果你加快速度,并做上述两件事,你会看到速度明显增加。

[编辑到#3] - > 我的意思是我说你日历的加载时间差不多是4秒。这是因为您在屏幕上显示了许多项目。也许你可以改变你的设计?这是一个疯狂的想法。对于每个月,您的日历目前必须跟踪大约30个项目。每个iPhone 6s屏幕大约15个月每月约有30个项目。而不是跟踪30个项目,可能跟踪排列在MonthCell的一行中的6个标签?您将不得不使用一些计算来使文本保持一致,但如果您可以使其工作,您的性能提升将是不可思议的。

我看到你有一个蓝色的后视图。所以可以有两种类型的细胞。一个有6个标签,另一个有30个标签。您可以根据需要提供哪个单元格。你可以做很多事情来提高性能。