我正在尝试创建一个与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.
附带截图。
为了克服延迟滚动,我删除了Month单元格的数据源。容器视图控制器本身就是两个集合视图的数据源。
12个月的集合视图已被子类化以存储年份值的索引路径。从本教程中获得了这个技巧:https://ashfurrow.com/blog/putting-a-uicollectionview-in-a-uitableviewcell/
但问题仍然存在,因为我在显示它之前在月份单元格上调用reloadData。
为了解决这个问题,我确实覆盖了UICollectionViewCell的prepareForReuse()方法,并在monthCollectionViewCell中将indexPath,delegate和datasource属性设置为nil。另外,删除了reloadData调用。但滚动仍然是滞后的。
教程链接与我的工作流程非常相似。
答案 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个标签。您可以根据需要提供哪个单元格。你可以做很多事情来提高性能。