iOS - 不会为某些单元格调用applyLayoutAttributes

时间:2014-06-02 13:19:11

标签: ios uicollectionviewlayout

我正在创建一个类似iOS中的跳板屏幕的视图。 (这是this question)的后续问题。 我的实现是一个集合视图,它具有使用UICollectionViewLayout的自定义布局。此布局是根据this answer中发布的代码构建的。由于我想要让我的图标摇动并在左上角有一个小删除按钮,因此我将子类化为UICollectionViewLayoutAttributes,其新属性为deleteButtonHidden。 所有这一切都很好地协同工作。但是当我使用更多图标填充集合视图以适合一个页面时,我遇到了问题。当我进入编辑模式,并来回滚动时,我发现有些图标不再抖动了。我试着调试它,我意识到我的一些单元格没有调用applyLayoutAttributes方法。 我也尝试在方法scrollViewDidScroll中调用invalidateLayout,但这没有帮助。

有没有人知道为什么有些细胞不能应用它们的属性?

更新: 我刚刚发现Apple有一个patent用于摇晃图标。因此,实施此设计不会得到批准。因此,这个问题不再适用了。

2 个答案:

答案 0 :(得分:4)

Apple指定在继承 UICollectionViewLayoutAttributes 时应该实现isEqual:方法。

  

如果您继承并实现任何自定义布局属性,则还必须覆盖继承的isEqual:方法以比较属性的值。在iOS 7及更高版本中,如果这些属性未更改,则集合视图不会应用布局属性。它通过使用isEqual:方法比较旧属性对象和新属性对象来确定属性是否已更改。由于此方法的默认实现仅检查此类的现有属性,因此必须实现自己的方法版本才能比较任何其他属性。如果您的自定义属性都相同,请调用super并在实现结束时返回结果值。

我希望它会对你有所帮助。

答案 1 :(得分:2)

问题在于,如果您继承 UICollectionViewLayoutAttributes ,则需要在子类中实现 copyWithZone:,因为超类实现了它。

所以只需添加 copyWithZone:实现,就可以了。