从 UICollectionView 中删除单元格而不从顶部重新加载 [关闭]
Posted
技术标签:
【中文标题】从 UICollectionView 中删除单元格而不从顶部重新加载 [关闭]【英文标题】:Delete cell from UICollectionView without reloading from top [closed] 【发布时间】:2013-04-24 10:30:46 【问题描述】:我在我的 ios 应用程序中使用 CollectionView。每个集合单元格都包含一个删除按钮。通过单击按钮,应删除单元格。删除后,该空间将被下面的单元格填充(我不希望重新加载 CollectionView 并再次从顶部开始)
如何使用自动布局从 UICollectionView 中删除特定单元格?
【问题讨论】:
简而言之:您应该遵循 MVC 协议。从模型中删除数据,然后重新加载您的视图。要获得更详细的答案,您应该发布您的代码(仅发布您怀疑问题所在的部分)并描述您已经尝试过的内容......否则您将得到的只是反对票,而不是一个好的答案。需要一个好问题才能得到一个好的答案。阅读FAQ 并没有什么坏处。 【参考方案1】:UICollectionView 将在删除后动画并自动重新排列单元格。
从集合视图中删除所选项目
[self.collectionView performBatchUpdates:^
NSArray *selectedItemsIndexPaths = [self.collectionView indexPathsForSelectedItems];
// Delete the items from the data source.
[self deleteItemsFromDataSourceAtIndexPaths:selectedItemsIndexPaths];
// Now delete the items from the collection view.
[self.collectionView deleteItemsAtIndexPaths:selectedItemsIndexPaths];
completion:nil];
// This method is for deleting the selected images from the data source array
-(void)deleteItemsFromDataSourceAtIndexPaths:(NSArray *)itemPaths
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
for (NSIndexPath *itemPath in itemPaths)
[indexSet addIndex:itemPath.row];
[self.images removeObjectsAtIndexes:indexSet]; // self.images is my data source
【讨论】:
固定单元格的删除时间如何使动画变慢或变快。 你需要继承 UICollectionViewFlowLayout。特别是实现 finalLayoutAttributForItemAtIndexPath。检查this【参考方案2】:没有像 UITableviewController 那样向 UICollectionViewController 提供委托方法。 我们可以通过向 UICollectionView 添加一个长手势识别器来手动完成。
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self
action:@selector(activateDeletionMode:)];
longPress.delegate = self;
[collectionView addGestureRecognizer:longPress];
在 longGesture 方法中,在该特定单元格上添加按钮。
- (void)activateDeletionMode:(UILongPressGestureRecognizer *)gr
if (gr.state == UIGestureRecognizerStateBegan)
if (!isDeleteActive)
NSIndexPath *indexPath = [collectionView indexPathForItemAtPoint:[gr locationInView:collectionView]];
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
deletedIndexpath = indexPath.row;
[cell addSubview:deleteButton];
[deleteButton bringSubviewToFront:collectionView];
在那个按钮动作中,
- (void)delete:(UIButton *)sender
[self.arrPhotos removeObjectAtIndex:deletedIndexpath];
[deleteButton removeFromSuperview];
[collectionView reloadData];
我认为它可以帮助你。
【讨论】:
[deleteButton bringSubviewToFront:collectionView];
似乎是一个错误。以上是关于从 UICollectionView 中删除单元格而不从顶部重新加载 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
通过 NSNotification 从 UICollectionView 中删除单元格