UICollectionViewCell 中的 UICollectionView 滚动缓慢/滞后
Posted
技术标签:
【中文标题】UICollectionViewCell 中的 UICollectionView 滚动缓慢/滞后【英文标题】:UICollectionView in UICollectionViewCell slow/laggy scrolling 【发布时间】:2016-08-08 16:01:45 【问题描述】:我正在尝试创建一个与 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 调用。但滚动仍然滞后。
教程链接与我的工作流程几乎相同。
这是我的代码的链接:https://github.com/nipun0505/TestCalendarView
【问题讨论】:
我会认真考虑不要让每个月都有自己的UICollectionView
。您嵌套了太多视图。取而代之的是一个包含 12 个单元格的 UICollectionView
,并构建一个自定义的 UIView
子类来绘制文本本身并进行自己的命中测试。
我应该改用多个 CATExtLayers 吗?
我会覆盖 drawRect:
并使用 NSString
drawing methods。
【参考方案1】:
您可以通过以下方式减少延迟:
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。
如果您加快速度,并执行上述 2 件事,您会看到速度明显提高。
[编辑到 #3] --> 我的意思是说你的日历的加载时间几乎是 4 秒。这是因为您在屏幕上显示了许多项目。也许你可以稍微改变你的设计?这是一个疯狂的想法。对于每个月,您的日历当前必须跟踪大约 30 项。每个 iPhone 6s 屏幕大约 15 个月,每月大约 30 件商品。不是跟踪 30 个项目,而是跟踪排列在 MonthCell 行中的 6 个标签?您将不得不使用一些计算来使文本对齐,但如果您能让它发挥作用,您的性能提升将是不可思议的。
我看到你的后视图是蓝色的。所以可以有两种类型的细胞。一个有 6 个标签,另一个有 30 个项目。您可以根据需要显示哪个单元格。您可以做很多事情来提高性能。
【讨论】:
好的。所以我删除了脏分配。而且它的工作更好一点。但我不明白第三点。如何减少加载时间? 你的日历还卡吗? 我使用 CATextLayer 而不是 31 个标签。但性能仍然达不到标准。我正在尝试别的东西。到达那里后将发布解决方案。以上是关于UICollectionViewCell 中的 UICollectionView 滚动缓慢/滞后的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 UIButton 删除 UICollectionViewCell
无法使用 UICollectionVIewCell 数据加载 UIView
UICollectionViewCell 中的 Outlet 为零
UICollectionViewCell 中的 SwiftUI 视图