简短问题:
有没有一种方法可以添加和删除类似于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/