UICollectionView 分页在 2^24 像素后中断
Posted
技术标签:
【中文标题】UICollectionView 分页在 2^24 像素后中断【英文标题】:UICollectionView paging breaks after 2^24 pixels 【发布时间】:2013-06-22 01:34:24 【问题描述】:设置
我有一个UICollectionView
,它允许用户翻阅图片,12 页。应用程序中应该有超过 200,000 张图片。我不希望用户滚动到第 20,000 页,所以有跳转到某个页面的功能。
问题
在横向模式下,分页在第 16,385 页上会出现故障。集合不再适应页面边界。如果您在第 16,384 页之前返回,您可以让它重新开始工作,但超过 16,385 的页面无法正常工作。
当错误出现时,我的代表也停止收到 scrollViewDidEndDecelerating:
消息。
假设
横向的页面 16,385 恰好从像素 16,777,216 开始,恰好是 2^24。我认为UICollectionView
或UIScrollView
中有些东西超过了 2^24。
这只是一个未记录的限制吗?我运气不好?
示例
我已经上传了一个 project 来演示这个问题。 Here's 相关的视图控制器。如果你摇动你的 iPad 或模拟器,你会被带到第 16,384 页,比 bug 出现的前一页。
蛇
如果您认为用户不需要能够访问第 20,000 页,那太棒了。我认为这与问题无关。
【问题讨论】:
请记住,CGFloat
是一个 IEEE 32 位浮点数,因此它只有一个 24 位尾数。所以在2^24到2^25的范围内,只能存储2的倍数;它不能存储任何奇数(例如 16,777,217)。这当然可能与您的问题有关,因为所有与视图相关的坐标和大小都使用 CGFloat
存储。
@robmayoff 这听起来可能是罪魁祸首。我以为是这样的,但找不到参考。
【参考方案1】:
我会说这是一个未记录的限制,并且会提交 Radar 错误报告,并附上示例项目作为证据。如果您正在寻找替代方法,您可以尝试使用 UIPageViewController
和每个页面的集合视图。您可以选择滑动动画,而不是默认的 iBooks 式动画,并非常接近地复制您的示例项目。
【讨论】:
UIPageViewController
的好主意。我会试一试。
不要提交错误。限制是预期的,并且限制足够高。以这种方式使用集合视图/表格视图/滚动视图是错误的。
这不是预期的。这个数字很高,但这并不意味着没问题。【参考方案2】:
您可以只加载 10,000 个页面,当用户跳转时,加载适当不同的 10,000 个页面。
【讨论】:
【参考方案3】:我想知道您是否尝试过使用多个部分?是每个部分的限制还是整个简历的限制?
【讨论】:
以上是关于UICollectionView 分页在 2^24 像素后中断的主要内容,如果未能解决你的问题,请参考以下文章