来自zIndex的UICollectionView顶部单元格未使用重叠单元格选择

时间:2014-03-17 06:18:04

标签: ios iphone objective-c uicollectionview z-index

我有一个UICollectionView,其中有多个单元格相互重叠。

我将zIndex设置在UICollectionViewLayout子类中UICollectionViewLayoutAttributes,以便它们以可视方式显示在所需的顺序中。 触摸均匀的命中区域按照预期工作,当点击单元格的重叠区域时,通过zIndex方法使用collectionView:didSelectItemAtIndexPath:更高的单元格。

我转换到UICollectionViewFlowLayout子类,当我转换回第一个UICollectionViewLayout子类时,在点击重叠区域时,并不总是选择具有较高zIndex的单元格。

进一步调查显示,UICollectionViewCell子视图中UICollectionView s的顺序决定了哪个单元格被点击。

我已经写了一个重新排序子视图的方法,但这看起来有点像黑客。

是否有更好的方法让UICollectionView单元格根据单元格在视觉上的显示方式返回collectionView:didSelectItemAtIndexPath:中的预期索引路径?

2 个答案:

答案 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中重新加载可能会导致不必要的重新加载