UICollectionView在布局转换期间错误地隐藏了单元格

Stu*_*art 7 transitions ios uicollectionview uicollectionviewlayout

有一些关于UICollectionView隐藏细胞的错误的问题,但我不认为这个问题已被覆盖.大多数其他问题似乎特别关注UICollectionViewFlowLayout和部分插入,而我在完全自定义布局之间转换时看到了这个问题.


执行交互式布局转换时,UICollectionView似乎隐藏了不应隐藏的单元格:

在此输入图像描述

(注意转换过程中左下角的单元格40和45消失)

它似乎发生在一个特定的地方:每当单元格的布局属性(从转换布局返回layoutAttributesForElementsInRect:)的框架的minX小于传入rect的minX和maxY大于rect's maxY.在代码中:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *layoutAttributes = [super layoutAttributesForElementsInRect:rect];
    for (UICollectionViewLayoutAttributes *attr in layoutAttributes) {
        if (CGRectGetMinX(attr.frame) < CGRectGetMinX(rect) &&
            CGRectGetMaxY(attr.frame) > CGRectGetMaxY(rect)) {
            NSLog("Element at index path %@ will disappear unexpectedly", attr.indexPath);
        }
    }
    return layoutAttributes;
}
Run Code Online (Sandbox Code Playgroud)

过渡布局返回正确的布局属性,显示单元格的中心逐渐在屏幕外移动.但是,一旦它超过了上面提到的那一点,集合视图似乎决定它不再可见(它是!)并将单元格的hidden属性设置为yes,忽略它直到其框架进一步移动rect.

我已经整理了一个演示此问题的示例项目(上面的动画就是这个样本的实际应用).为简单起见,它使用了两个简单的流布局,但我在处理自定义UICollectionViewLayout子类之间的转换时首先注意到了它.大多数代码只是使用捏手势识别器管理交互式转换,我很确定那里没什么了不起的.

当使用简单的动画布局过渡(setCollectionViewLayout:animated:)时,似乎不会发生这个问题...尝试使用慢动画运行示例项目,然后点击一个单元格 - 所有单元格按预期动画.

UICollectionView对我来说似乎是一个错误,但如果有人知道有效的解决方法,我真的很感激.


更新:

我已向Apple提交了错误报告,同时打开了技术支持事件,以查看是否可以找到解决方法.如果我从工程师那里学到任何有用的东西,我会添加一个答案.

更新:

Apple DTS回复确认这一个错误,并且没有解决方法.对于我的情况,我最终只是强迫消失的细胞达不到使它们消失的神奇阈值.