简短问题:

有没有一种方法可以添加和删除类似于performBatchUpdates: insertItemsAtIndexPaths:甚至deleteItemsAtIndexPaths:方法的reloadItemsAtIndexPaths:块中的单元格和节之类的补充视图?

详细说明:

我在部分中使用UICollectionView。像网格一样布置单元,每行最多可以有6个单元。如果单元格的总数未填满节的所有行,则添加其他补充视图。其他补充视图仅填充空白区域。因此,结果应该是每个部分都被所有可用单元格完全填充,而(可能)剩余的空白点被补充视图填充。因此,每行都有6个视觉元素,包括一个单元格或一个补充视图。

为此,我使用以下UICollectionViewFlowLayout实现实现了一个基于prepareLayout:的自定义布局:

- (void)prepareLayout {
    [super prepareLayout];

    self.supplementaryViewAttributeList = [NSMutableArray array];
    if(self.collectionView != nil) {
        // calculate layout values
        CGFloat contentWidth = self.collectionViewContentSize.width - self.sectionInset.left - self.sectionInset.right;
        CGFloat cellSizeWithSpacing = self.itemSize.width + self.minimumInteritemSpacing;
        NSInteger numberOfItemsPerLine = floor(contentWidth / cellSizeWithSpacing);
        CGFloat realInterItemSpacing = (contentWidth - (numberOfItemsPerLine * self.itemSize.width)) / (numberOfItemsPerLine - 1);

        // add supplementary attributes
        for (NSInteger numberOfSection = 0; numberOfSection < self.collectionView.numberOfSections; numberOfSection++) {
            NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:numberOfSection];
            NSInteger numberOfSupplementaryViews = numberOfItemsPerLine - (numberOfItems % numberOfItemsPerLine);

            if (numberOfSupplementaryViews > 0 && numberOfSupplementaryViews < 6) {
                NSIndexPath *indexPathOfLastCellOfSection = [NSIndexPath indexPathForItem:(numberOfItems - 1) inSection:numberOfSection];
                UICollectionViewLayoutAttributes *layoutAttributesOfLastCellOfSection = [self layoutAttributesForItemAtIndexPath:indexPathOfLastCellOfSection];

                for (NSInteger numberOfSupplementor = 0; numberOfSupplementor < numberOfSupplementaryViews; numberOfSupplementor++) {
                    NSIndexPath *indexPathOfSupplementor = [NSIndexPath indexPathForItem:(numberOfItems + numberOfSupplementor) inSection:numberOfSection];
                    UICollectionViewLayoutAttributes *supplementaryLayoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:ARNCollectionElementKindFocusGuide withIndexPath:indexPathOfSupplementor];
                    supplementaryLayoutAttributes.frame = CGRectMake(layoutAttributesOfLastCellOfSection.frame.origin.x + ((numberOfSupplementor + 1) * (self.itemSize.width + realInterItemSpacing)), layoutAttributesOfLastCellOfSection.frame.origin.y, self.itemSize.width, self.itemSize.height);
                    supplementaryLayoutAttributes.zIndex = -1;

                    [self.supplementaryViewAttributeList addObject:supplementaryLayoutAttributes];
                }
            }
        }
    }
}

如果开头的所有数据均可用,并且数据没有变化,则此方法非常有用。但是,如果在生命周期中添加和删除数据,它将惨遭失败。在performBatchUpdates:中插入和删除单元格会弄乱补充视图。

应该发生什么:

对于每个插入了insertItemsAtIndexPaths:的单元格,应删除相同indexPath的补充视图。此外,对于使用deleteItemsAtIndexPaths:删除的每个单元格,应在相同的indexPath处添加新的补充视图。

问题:

我的布局的prepareLayout:被调用并计算正确的layoutAttributes。但是layoutAttributesForSupplementaryViewOfKind:atIndexPath:被称为奇怪的indexPaths。具体来说,layoutAttributesForSupplementaryViewOfKind:atIndexPath:是为从indexPaths数组中删除的旧supplementaryViewAttributeList调用的!

示例:

在插入新单元格的情况下,prepareLayout:正确删除了layoutAttributes,但是仍然为不再可用且已删除的indexPath 调用了layoutAttributesForSupplementaryViewOfKind:atIndexPath: !而且仅此而已。对于所有其他补充视图,没有其他任何indexPath的额外调用。

为什么layoutAttributesForSupplementaryViewOfKind:atIndexPath:调用不再可用的indexPaths?如何正确删除,插入或重新加载补充视图?我想念什么?

来源:

完整的源代码可以在这里找到:

自定义布局:https://github.com/sarn/ARNClassicFilms/blob/master/classicFilms/classicFilms/layout/ARNCollectionViewFocusGuideFlowLayout.m

CollectionView控制器:
https://github.com/sarn/ARNClassicFilms/blob/master/classicFilms/classicFilms/view-controllers/ARNMovieOverviewController.m
(performBatchUpdates:在该类的最后一个方法中)

最佳答案

您的评论对我没有帮助,我找到了另一段代码并添加了它,它仍然起作用,甚至删除了上面的建议,它仍然起作用。集合视图当然是强大的,但是却忘了其中一项功能……

- (NSArray<NSIndexPath *>   *)indexPathsToDeleteForSupplementaryViewOfKind:(NSString *)elementKind
{
    return self.removedIndexPaths;
}

事情可能会变得很糟糕。

关于ios - 如何正确插入或删除UICollectionView补充 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36386854/

10-08 20:59