我注意到,如果我更改UICollectionView的帧(例如,当切换调用状态栏时),集合视图不会为其新帧正确更新其单元格.在短视频中看起来最简单:
http://cl.ly/2t2Y2A3A2w1D/CollectionViewTest.mov
这个简单测试的源文件在这里:
http://cl.ly/0S0A360B3I3Q/CollectionViewTest.zip
我是否使用UICollectionViewController或UIViewController似乎并不重要.有没有人见过这个?我错过了什么吗?我发现的唯一解决方法是在视图控制器的viewWillLayoutSubviews或viewDidLayoutSubviews中的集合视图上调用reloadData,但是当集合视图的框架受到用户拖动的影响时,它远非理想,因为reloadData被多次调用并导致用户拖动时非常缓慢的UI更新.
我有一个UICollectionView使用UICollectionViewFlowLayout的自定义子类,使部分标题贴在屏幕的顶部,同时滚动就像UITableView的简单样式.我的代码基于这种方法:
http://blog.radi.ws/post/32905838158/sticky-headers-for-uicollectionview-using
此外,集合视图设置为在用户滚动到底部时加载更多结果.也就是说,当用户到达集合视图的底部时,Web请求会加载更多数据,然后重新加载集合视图,即调用reloadData.
它似乎运行良好,除了我通过运行iOS 7和7.1的TestFlight从beta测试者那里得到一些崩溃报告,他们说当他们快速向下滚动到底部(即触发更多结果加载)时偶尔发生以下情况:
*** -[__NSArrayM objectAtIndex:]: index 28 beyond bounds [0 .. 16]
PRIMARY THREAD THREAD 0
__exceptionPreprocess
objc_exception_throw
-[__NSArrayM objectAtIndex:]
-[UICollectionViewFlowLayout(Internal) _frameForItemAtSection:andRow:usingData:]
-[UICollectionViewFlowLayout layoutAttributesForItemAtIndexPath:usingData:]
-[UICollectionViewFlowLayout layoutAttributesForItemAtIndexPath:]
-[MyCustomCollectionViewFlowLayout layoutAttributesForItemAtIndexPath:]
-[MyCustomCollectionViewFlowLayout layoutAttributesForSupplementaryViewOfKind:atIndexPath:]
-[MyCustomCollectionViewFlowLayout layoutAttributesForElementsInRect:]
-[UICollectionViewData validateLayoutInRect:]_block_invoke
-[UICollectionViewData validateLayoutInRect:]
-[UICollectionView layoutSubviews]
-[UIView(CALayerDelegate) layoutSublayersOfLayer:]
-[CALayer layoutSublayers]
Run Code Online (Sandbox Code Playgroud)
好像当我的自定义流布局代码调用[self.collectionView numberOfItemsInSection:someSection]以获取节的最后一个项的布局属性时,该调用基于新加载的数据返回(例如,在这种情况下,一个节现在有29个项)但是内部的默认流布局仍然使用某种缓存数据(例如,在这种情况下,该部分只有17个项目).不幸的是,我无法自己重现崩溃,即使是经历过它的beta测试人员也无法一致地重现它.
有什么想法吗?