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 视图

UITableViewCell 中的 UICollectionViewCell 中的按钮点击操作

UICollectionViewCell 中的按钮