我有一个UICollectionView
,其中有多个单元格相互重叠。
我将zIndex
设置在UICollectionViewLayout
子类中UICollectionViewLayoutAttributes
,以便它们以可视方式显示在所需的顺序中。
触摸均匀的命中区域按照预期工作,当点击单元格的重叠区域时,通过zIndex
方法使用collectionView:didSelectItemAtIndexPath:
更高的单元格。
我转换到UICollectionViewFlowLayout
子类,当我转换回第一个UICollectionViewLayout
子类时,在点击重叠区域时,并不总是选择具有较高zIndex
的单元格。
进一步调查显示,UICollectionViewCell
子视图中UICollectionView
s的顺序决定了哪个单元格被点击。
我已经写了一个重新排序子视图的方法,但这看起来有点像黑客。
是否有更好的方法让UICollectionView
单元格根据单元格在视觉上的显示方式返回collectionView:didSelectItemAtIndexPath:
中的预期索引路径?
答案 0 :(得分:2)
从我的测试来看,布局到布局转换似乎忽略了推送视图控制器布局的zIndex
属性。这闻起来像一个臭虫。您可以在视图控制器出现后重新加载来解决此问题:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Reloading will clear selection, so we remember which index paths are selected before reload
NSArray *selectedIndexPaths = self.collectionView.indexPathsForSelectedItems;
NSIndexSet *allSections = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)];
[self.collectionView performBatchUpdates:^{
// First, reload to correct the zOrder
[self.collectionView reloadSections:allSections];
// Then, re-select the index paths
if (selectedIndexPaths.count)
{
for (NSIndexPath *indexPath in selectedIndexPaths)
{
[self.collectionView selectItemAtIndexPath:indexPath
animated:YES
scrollPosition:UICollectionViewScrollPositionNone];
}
}
} completion:nil];
}
它仍然有点像黑客,但比手动重新排序集合视图的子视图更简洁。
答案 1 :(得分:0)
这应该是正确的方法:https://stackoverflow.com/a/40010956/1032900 在viewDidAppear中重新加载可能会导致不必要的重新加载