自定义UICollectionViewLayout动画问题

时间:2013-09-05 16:20:30

标签: ios objective-c layout uicollectionview uicollectionviewlayout

我开发了一个自定义UICollectionViewLayout来处理客户端应用程序上的一些高级布局要求,看起来效果真的很好。直到我开始尝试使用动画。

我花了一些时间来处理文档并使其更灵活,因此可以在此处找到:https://github.com/liamnichols/LNCollectionViewPagedLayout

它的目的是将内容分页到新页面,如果它不适合上一页,以确保内容不会跨越两个页面,它似乎处理这个好。

我从一开始就注意到它存在动画问题,但我最初从不需要使用动画,因此没有尝试调查/修复,尽管现在它变成了要求UICollectionViewCell可以扩展显示更多内容,当我尝试使用任何形式的动画方法(reloadRowsAtIndexPaths:performBatchUpdates:completion:等)时,我总会得到非常奇怪的行为,从崩溃(view argument is nil)到混乱的布局。

目前我的布局是通过在UICollectionViewLayoutAttributes上创建一个prepareLayout字典,方法是询问代表每个单元格的大小,然后运行一些逻辑来查看它是否合适等等。

当调用layoutAttributesForElementsInRect:方法时,它可以简单地查询字典并获取与该rect相关的属性数组。

首先,这是创建此布局的最佳方式吗?我发现很难找到有关创建自定义布局以满足我的需求的文档,并最终查看其他开源库以获取有关如何做的指示。

其次,我还没有实现初始/最终布局属性方法,因为我无法弄清楚如何正确使用它们。这是我遇到问题还是可选的原因?

正确创建UICollectionViewLayouts的任何帮助或指示都会很棒。

1 个答案:

答案 0 :(得分:1)

对于扩展单元格的问题(或者只是通常改变大小的单元格),这个答案may be helpful。简短的回答是initialLayoutAttributesForAppearingItemAtIndexPath:的默认实现(以及通常所有的初始/最终布局属性方法)并不总是返回正确的帧,您必须覆盖此方法并修复错误。

调试这些类型的问题非常简单。首先记录返回的属性,如下所示

- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
    UICollectionViewLayoutAttributes *attributes = [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath];
    NSLog(@"indexPath=%@, attributes=%@", itemIndexPath, attributes);
    return attributes;
}

并确定帧何时不正确。从那里你可以想出一个纠正错误的方法。这很详细,我可以在不知道更多细节的情况下获得。