旋转设备时,我看到UICollectionView
自定义布局(的子类)的一些神秘行为。UICollectionViewLayout
我有一个简单的水平滚动单元格行。当将设备从纵向旋转到横向时,以前不可见的其他单元格变得可见,并且那些出现的单元格的动画是错误的(它使用熟悉的重影效果,我认为这是收藏视图的某种默认动画效果布局)。请注意此动画中最左侧出现的单元格:
有关自定义布局设置的一些详细信息:
shouldInvalidateLayoutForBoundsChange:
返回YES
。layoutAttributesForItemAtIndexPath:
如果尚未创建字典中的属性,则在缓存中。- 在
layoutAttributesForElementsInRect:
我计算哪些单元格应该手动可见,并在centre
每次返回它们的属性之前稍微调整它们的属性。
然后我有以下代码来处理初始/最终布局属性:
- (void)prepareForAnimatedBoundsChange:(CGRect)oldBounds
{
[super prepareForAnimatedBoundsChange:oldBounds];
self.animatingBoundsChange = YES;
}
- (void)finalizeAnimatedBoundsChange
{
[super finalizeAnimatedBoundsChange];
self.animatingBoundsChange = NO;
}
- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath
{
if (self.animatingBoundsChange) {
// If the view is rotating, appearing items should animate from their current attributes (specify `nil`).
// Both of these appear to do much the same thing:
//return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
return nil;
}
return [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath];
}
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath
{
if (self.animatingBoundsChange) {
// If the view is rotating, disappearing items should animate to their new attributes.
return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
}
return [super finalLayoutAttributesForDisappearingItemAtIndexPath:itemIndexPath];
}
在我看来,新出现的单元格的初始布局属性在某种程度上是不正确的(它毕竟在正确的位置结束)。但是当我记录center
从该方法返回的布局属性的属性时initalLayout...
,一切看起来都是正确的——所有这些都沿水平轴均匀分布。
单元格动画不正确的唯一显着特征是,当调用该方法时,它的单元格没有在[collectionView visibleCells]
数组中返回。initialLayout...
但是layoutAttributesForElementsInRect:
,它前面的 确实正确地标识了它的布局属性是必需的。
发生什么了?对幕后发生的事情的一些见解会非常有帮助......UICollectionView
看起来像一个巨大的黑匣子。