[英]Crash with UICollectionView and custom flow layout
我已经使用http://blog.radi.ws/post/32905838158/sticky-headers-for-uicollectionview-作为跳跃点实现了集合视图的粘性节标题,并且它们可以正常工作。
但我看到一个非常奇怪的崩溃。
当我按下编辑器详细信息视图时,更改项目的名称,使其从一个部分移动到另一个部分(想想,更改联系人列表中按姓氏的第一个字母分组的人员的姓氏),然后弹回在收集视图中,它会因投诉而崩溃
UICollectionView received layout attributes for a cell with an index path that does not exist
这是执行流程:
在编辑器详细信息视图中,我更改项目的名称,使其从X部分移动到Y部分。
项目的模型发出“名称已更改”通知。
拥有集合视图的根视图控制器捕获“名称已更改”通知,重建其内部索引,然后在集合视图上调用-reloadData。 这一切都很好。
我点击UI中的Back按钮,发生以下流程(通过调试器和caveman NSlog调用确认)
记录继承的基线布局我看到先前排列的单元格的属性,而不是当前单元格的属性。 例如,布局是我刚才提出的修改前的安排。 因此,不正确的部分和/或单元格不正确。
现在这就是打扰我的想法。
如果我注释掉-layoutAttributesForElementsInRect的整个实现,它仍然会崩溃。 但是,如果我发表评论:
- (BOOL) shouldInvalidateLayoutForBoundsChange:(CGRect)newBound {
return YES;
}
然后,它正常工作。
这告诉我集合视图或流布局中的某些东西是缓存结果,但仅当流布局shouldInvalidateLayoutForBoundsChange时
注意,如果我只使用一个vanilla UICollectionViewFlowLayout,一切正常。
TLDR
自定义UICollectionViewFlowLayout,如果-shouldInvalidateLayoutForBoundsChange返回YES,则从[super layoutAttributesForElementsInRect]获取过时的布局属性
有任何想法吗?
我通过删除shouldInvalidateLayoutForBoundsChange:
override来解决这个问题,而是在集合视图的委托上实现scrollViewDidScroll:
以使布局无效:
override func scrollViewDidScroll(scrollView: UIScrollView) {
collectionView?.collectionViewLayout.invalidateLayout()
}
这样可以保留粘性标题但会停止崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.