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

bob*_*eno 5 ios uicollectionviewlayout

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

有没有人知道为什么有些单元格没有应用它们的属性?

更新:我刚刚发现Apple拥有摇晃图标专利.因此,实施此设计不会得到批准.因此,这个问题不再适用.

kel*_*lin 5

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

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

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


小智 3

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

因此,只需添加您的copyWithZone:实现即可,它应该可以工作。