发生了什么
目前我有一个使用两个UICollectionViews内部的应用程序UITableView.这样我创建了一个类似应用程序的Pulse News.我的问题是,有时第6行和第11行完全消失,留下一个空白区域应该是单元格.我真的不介意,如果所有细胞都是这样的(这种方式我可以假设我没有做正确的事情),但问题是,正好发生在那些特定的细胞上.
我的理论
第6行和第11行是我开始滚动时出现的行,所以默认情况下我可以看到5个单元格,当我进行第一次水平滚动时,第6行会出现(有时会出现空白).
是)我有的
我目前唯一要做的就是:
[self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER];
Run Code Online (Sandbox Code Playgroud)
在viewDidLoad.在创建细胞时:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];
NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]];
[cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController];
return cell;
}
Run Code Online (Sandbox Code Playgroud)
所以在我的承诺中没有任何幻想在这里发生.我虽然在数据源(虚拟JSON文件)上有问题,但有时它工作正常并且单元格显示,所以我猜从那部分是可以的.
所以我的"问题":有谁知道发生了什么?我真的不想说这是来自iOS的错误,但我想不出别的什么.
编辑1.0
令人惊讶的是这种方法
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
Run Code Online (Sandbox Code Playgroud)
在indexPath不计算[0,5]的情况下从[0,4]变为[0,6].我第一次真正在iOS中看到这种情况.
编辑2.0
我已经改变了创建单元格的方式,而不是出列我使用旧方法:
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil];
MyCell *cell = (MyCell *)[nib objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
仍然是同样悲伤的结果.
像这样的代码
collectionLayout.estimatedItemSize = CGSize(width: 50, height: 25)
collectionLayout.itemSize = UICollectionViewFlowLayoutAutomaticSize
collectionLayout.minimumInteritemSpacing = 10
for _ in 0 ..< 1000 {
let length = Int(arc4random() % 8)
let string = randomKeyByBitLength(length)
array.append(string!)
}
collectionView.reloadData()
Run Code Online (Sandbox Code Playgroud)
细胞限制:
当我在iOS 12上运行它时,它是不同的.左模拟器是iOS 11,右边是iOS 12:
但是,当我滚动它时,细胞的帧将是正常的.
我有一个带有图像网格的UICollectionView.当您点击其中一个时,它会打开网格并显示包含一些详细信息的子视图.像这样:

我通过调整UICollectionViewLayoutAttributes并在transform3D属性上为所选项目的当前行下面的所有单元格设置转换,在我的UICollectionViewLayout中打开网格.这非常好用,并且是比我第一次尝试将另一个单元格插入网格时更好的动画和更简单的方法,该网格与其他单元格的大小不同.
无论如何......它大部分时间都有效,但在继续使用之后我会在集合视图中看到旧图像.它们就像幽灵细胞.我无法点击它们,就像它们没有被正确地从集合视图中移除一样,并且它们位于单元顶部以防止点击并且只是令人讨厌.像这样:

任何想法为什么这些细胞这样做?
编辑:我想补充一下,我认为只有当我快速滚动集合视图时才会发生这种情况.我已经编写了自己的UICollectionViewFlowLayout替换来测试它是否仍然存在.确实如此.
编辑2:3D变换或布局与此无关.它必须是UICollectionView中的错误.我可以通过快速滚动,让停止,然后查询屏幕上的视图来利用.细胞数量通常是两倍,但它们在彼此堆叠时是隐藏的.我上面的实现揭示了它们,因为我做了翻译.
这确实会损害性能.
请参阅我的答案以获得解决方案